该示例介绍了使用了 hbVPStitch、 hbVPRemap 、 hbVPJPEGDecode 、hbVPJPEGEncode 等API,涉及到stitch、gdc和codec硬件ip,完成一次360环视场景拼接的应用。
该示例实现的功能为:对使用车上鱼眼摄像头拍摄的四张前视、右视、后视、左视畸变图,进行去畸变与环视拼接,完成一次360环视场景拼接的应用。 首先会为四张畸变图创建map,使用codec硬件ip读取鱼眼畸变图转换为nv12数据,然后运行gdc硬件ip,将畸变图变为俯视图,接着会运行stitch硬件ip,将俯视图进行拼接成环视拼接图。
代码主要分为以下步骤:
概念声明
VCS坐标系描述了车辆的坐标系。坐标轴x对应车辆的前方,y对应车辆的左侧,z对应车辆的顶部。这个坐标系的原点不是车辆的中心,而是车辆后轴的中心。
IPM坐标系描述了图像透视映射的坐标系。
鱼眼畸变图转换map生成详述
生成map主要目的为使用remap功能,可以生成像素映射关系:

创建将鱼眼畸变图转换为俯视图的核心函数为 TransformMapGenerate(),主要逻辑如流程图所示:
其中,TransformMapGenerate() 中使用的 CalculateExtrinsicTransform(),对应流程图中的倒数第二步,作用为将车辆坐标系数据转换到相机坐标系,主要逻辑如流程图所示:
其中:
IntrinsicXYZ2R() 作用为:将欧拉角表示的旋转(Roll-Pitch-Yaw)转换为一个旋转矩阵,用于描述三维空间中的旋转变换。旋转矩阵能够将旋转操作以矩阵乘法的形式应用到向量上。这个矩阵的作用是将 ADAS 相机坐标系下的点转换到相机坐标系下,实现坐标系的变换和对齐。这种变换在计算机图形学和计算机视觉中常常被使用。
stitch lut表生成详述
lut表函数的作用为:表示每个像素点融合状况,主要目的为生成过渡带,形成模糊效果。
解释:lut表的dump出情况如下图。0和255是对立关系,255是取src0,0是取src1。0<x<255,则表示取部分src0,取部分src1。128或127为强制过渡带,两边数字渐小直到0或渐大到255,形成渐变模糊效果。

运行方法
该示例位于 vp_samples/script/05_avm 目录下,包含以下脚本:
运行命令行说明
run_avm.sh:该脚本实现四张鱼眼畸变图环视拼接的示例功能。run_avm.sh脚本中命令行内容如下:
${bin}:编译好的可执行文件
使用的时候,进入 vp_samples/script/05_avm 目录,然后直接执行run_avm.sh即可,如下代码块所示:
结果说明
示例运行结束后会在当前目录下生成可视化图像。部分结果如下所示:
原图:
camera0(后视) ![]() | camera1(前视) ![]() |
camera0(左视) ![]() | camera1(右视) ![]() |
去畸变+俯视图:
camera0(后视) ![]() | camera1(前视) ![]() |
camera0(左视) ![]() | camera1(右视) ![]() |
拼接环视图:
该示例的remap默认运行在gdc上。
如需替换图片,请将图片对应的相机参数配置数据进行修改,否则运行会有问题。
环境变量:
HB_AVM_GDC_MAP_DUMP 选择是否dump gdc的map。
HB_AVM_GDC_RES_DUMP 选择是否dump俯视图的结果。
HB_AVM_LOG_LEVEL log等级,1为debug。
当YUV图像dump为JPG文件时,如果YUV图像的宽度或者高度不满足Codec对齐规则,则默认使用opencv的方式进行dump。