结合sample代码来分析海思DPU模块运行原理

更新时间:2023-06-17 16:50:21 阅读: 评论:0

结合sample代码来分析海思DPU模块运⾏原理
自相矛盾的寓意前⾔
高清星空图片>桑叶泡水海思DPU(Depth Process Unit)的中⽂翻译为深度信息处理单元,主要是来实现双⽬测距和三维重建的硬件加速功能从⽽提⾼实时性。海思SDK⾥⾯和DPU相关的⽂档资料很少,就两篇:《HiDPU⼯具使⽤指南》和《HiDPUAPI参考》。所以这⾥有必要结合sample代码来理清其思路。
基本概念
DPU包括两个⼦模块。⼀个叫RECT,注意这⾥不是矩形框的意思,⽽是rectify,即校正的意思,后⾯会进⼀步解释其原理。另⼀个模块叫Match,即匹配的意思。这些概念需要有些双⽬测距/重建的基础才能⽐较好理解。
此外,在dpu sample代码中有两个独⽴的运⾏ca。馒头的吃法
⼀个是⾛VI和VPSS通道,直接对双VPSS输出数据来进⾏双⽬测距以此实现实时双⽬视频流的三维重建。其⼊⼝函数为:
SAMPLE_DPU_VI_VPSS_RECT_MATCH();
另⼀个是基于双⽬拍摄到的图⽚来进⾏双⽬测距和重建。 其⼊⼝函数为:
SAMPLE_DPU_FILE_RECT_MATCH();
两者算法原理都差不多,都是先做校正再做匹配来得到视差图,为后⾯的测距和重建奠定坚实基础。这⾥⽅便起见,就介绍第⼆个ca。DPU RECT
RECT校正是⽤来将双⽬同时拍摄到的图⽚通过对应摄像头的映射参数mapx和mapy进⾏⾏对齐。⽽每个摄像头的映射参数是通过摄像头标定所得到的内参和外参来获取得。这两句话如果没有标定基础得话,理解起来会有些困难。换句话说,每个摄像头都有⾃⼰得视⾓和畸变,它们就是靠各⾃得映射参数⽂件mapx,mapy来去畸变并实现⾏对齐。
在sample代码中,双⽬摄像头对应得mapx和mapy参数为:最聪明的狗狗
HI_CHAR *apcMapFileName[DPU_RECT_MAX_PIPE_NUM] = {"./data/input/lut/1050x560_LeftMap.dat",
"./data/input/lut/1050x560_RightMap.dat"};
这⾥1050x560_LeftMap.dat和1050x560_RightMap.dat分别指左和右摄像头得映射参数,其分辨率为1050x560。它把x和y⽅向得参数融合进⼀个⽂件,其⾥⾯得排列格式为:
可以看到原始得mapx或y每个坐标值为浮点数,占4个字节,两者融合起来就变成每个坐标值占8个字节了,如果分辨率为1050x560得话,那么融合得到数据⽂件size为1050x560*8 bytes。
需要注意的是,代码⾥⾯得1050x560_LeftMap.dat和1050x560_LeftMap.dat的⼤⼩只为 1050*560*4bytes,那是因为使⽤海思dpu⼯具dpu_(详见HiDPU⼯具 开发指南)做了⼀个内部转换来节省内存空间。
映射参数⽂件⼜叫查找表LUT。  举个例⼦,如果想获取左摄像头图⽚对齐后⽬标图像(1,0)的像素值,那么得先去
1050x560_LeftMap.dat查找表中(1,0)出得x和y⽅向坐标值,假如是(3.2, 2.8),那么就到源图像中做⼀个插值,所得结果就赋给⽬标图像(1,0)。
当然在海思dpu模块中,这个查找表过程由硬件来实现,我们只需要把查找表以及源图像正确得输⼊进去即可。
我的老师叫小贺
/************************************************
step2:  start DPU RECT
*************************************************/
for (i = 0; i < DPU_RECT_MAX_PIPE_NUM; i++)
{
s32PipeNum = i;
s32Ret = SAMPLE_COMM_DPU_RECT_LoadLut(apcMapFileName[i],
&s_stSampleDpuConfig.astDpuRectMemInfo[i], &s_stSampleDpuConfig.s32LutId[i]);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("load lut failed for %#x!\n", s32Ret);
goto END4;
}
}
生炒猪肚
。。。。。。
s32Ret = SAMPLE_COMM_DPU_RECT_Start(s_stSampleDpuConfig.DpuRectGrp,
&s_stSampleDpuConfig.stDpuRectGrpAttr, astChnAttr);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("start dpu rect failed for %#x!\n", s32Ret);
goto END5;
}
卢梭名言
DPU MATCH
双⽬图像⾏对齐后,接下来就是⾏匹配来找到对应点,找到后,就将该两点的x坐标值相减,所得到差就是所谓视差值。这⾥的难点以及计算量⼤的⼯作⾃然是匹配。
双⽬⽴体视觉匹配算法有SAD, BM以及SGBM等。相较⽽⾔,SGBM⽤的⽐较多,因为它是全局算法,其匹配效果肯定好于局部匹配算法BM,⽽且它还是半全局的,所以速度⽅⾯也有所提升。 ⽬前还不清楚海思dpu⾥⾯⽤的是哪个匹配算法,应该是全局或半全局。
其对应功能启动的代码如下:
s32Ret = SAMPLE_COMM_DPU_MATCH_Start(s_stSampleDpuConfig.DpuMatchGrp,
&s_stSampleDpuConfig.stDpuMatchGrpAttr, &stChnAttr);
需要注意的是,匹配得到的视差图⼤⼩为 width*height*2,⽽不是 width*height*4,这是因为其每个像素数据格式为S10Q6((1bit 符号位+9bit 整数部分+6bit ⼩数部分),换句话来说,⽤2个byte来表⽰float32数了。
⼩结
RECT和MATCH⽆疑是双⽬⽴体视觉中最耗计算资源的部分。所以⽤硬件来实现这两步可以⼤⼤提⾼测距和三维重建实时性。得到视差图后就可以通过公式d = (B*fx) / d来计算得到Z轴⽅向上的值,进⽽可以其x,y坐标值,这⾥就不再赘述。

本文发布于:2023-06-17 16:50:21,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/976900.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:匹配   得到   算法   参数   代码   摄像头   查找   实现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图