AI老铁 · 2020年08月13日

基于自己的双目标定参数来运行海思DPU模块

转载自:基于自己的双目标定参数来运行海思DPU模块
作者:ltshan139

前言

海思sample DPU代码只是大概讲解了Rect和Match的api调用过程。可能有人还是对如何将自己标定出来的参数运行在DPU上比较茫然。基于此,本文把这个思路理清下,希望能有所帮助。

查找表的求得

在《结合sample代码来分析海思DPU模块运行原理》中有提到,我们标定完双目摄像头得到左右摄像头的内参和外参后,就可以调用initUndistortRectifyMap()来分别得到左、右摄像头在x和y方向上的映射表mapx和mapy。

拿到mapx和mapy后,要做的第一步就是将mapx和mapy合成一个表,其格式如下

20200709172139828.png

在python里面,就两句话就可以完成。

left_map = np.dstack((left_mapx, left_mapy))
。。。 。。。
right_map = np.dstack((right_mapx, right_mapy))

合成一个表后,第二步工作就是要使用海思提供的转换工具svp_dpu_tool_rect_2.0.exe(解压缩HiDPU_PC_V2.0.0.0.tgz)来将该查找表转换海思内部格式。 该公式在windows平台上运行,其运行命令如下示例所示。

svp_dpu_tool_rect_2.0.exe ./Input/1920x1080_RightMapF.dat ./Output/1920x1080_RightMapI.dat 1920 1080

第一个是输入参数,为我们标定的参数;第二个是输出,生成给海思使用的。后面两个参数为该查找表的分辨率。注意,目前海思最大只能支持1920x1080的查找表。

输入数据格式的转换

在HI_MPI_DPU_RECT_SendFrame()中有对输入数据格及其分辨率式进行描述,如下所示。

20200709173841994.png

分辨率最大只能支持到2048x2048。另外只支持YUV420SP/422SP以及YUV400的数据格式。如果视频实时测距的话,那么vpss的输出格式要相应进行设置;如果是图片文件,那么先要解码并转换成这3种格式。顺便吐槽一下,opencv没有bgr直接转yuv420sp或422sp或yuv400的操作。我是先转到YV12(I420),然后取Y planar存成yuv400。 大家如果有更好的办法,请告诉我。

小结

完成上面两大步骤的准备后,后面就是理解sample code并对下面宏等地方进行相应修改。

#define SAMPLE_DPU_IN_WIDTH (1920)
#define SAMPLE_DPU_IN_HEIGHT (1080)
#define SAMPLE_DPU_DST_WIDTH (1920)
#define SAMPLE_DPU_DST_HEIGHT (1080)

如果想知道rect后的两张图片是否行对齐,可以调用接口HI_MPI_DPU_RECT_GetFrame()来一把获取左右校正后的图片,并调用SAMPLE_COMM_DPU_WriteFrame2File()来保存成文件。

最后要说明的是,因为我们摄像头参数是基于4k的,为了适应海思dpu需求,我先将4k的map resize成1080p,然后再执行后面的步骤,但是校正后的图片内容就有些乱了,更不要说对齐。 我个人觉得基于4k图片的map值本身就不能通过resize成1080p来校正。如果有人遇到类似问题,并解决掉,请指教。



海思AI芯片系列文章



更多海思AI芯片方案学习笔记欢迎关注海思AI芯片方案学习

推荐阅读
关注数
855
内容数
40
海思AI芯片(Hi3519A/3559A)方案学习系列笔记,欢迎关注。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息