自动驾驶AVM环视算法--3D碗型投影模式的算法原理和代码实现

一、算法的原理

1、需要先标定相机的内参和外参。

当前测试使用的主要是虚拟的测试视频,所一相机的内参都是相同,相机内参为

float a[4] = { 160,-0.002,0,0 };

相机的内参模型参见:Fisheye Calibration Basics- MATLAB & Simulink- MathWorks 中国

参数说明:

a0=160
a2=-0.002
a3=0
a4=0

根据上述的参数就可以自己算图像的坐标点和相机坐标点的对应坐标,计算公式如下所示:

 真实图像上的坐标点(个人理解就是校正后的图像坐标点)

系数

相机的内参(参见上述的数据a0=160、a2=-0.002、a3=0、a4=0)

半径

根据相机的内参数据就可以计算语言图像的矫正图像,一下是相机的矫正图像效果图像

在根据相机的外参,由于使用的虚拟视频,相机的安装位置和角度都是已知的无需标定,实际的应用中需要测量安装高度和标定相机的角度,有相机的外参就可以计算出相机的旋转矩阵,当前相机的外参数数据和对应的旋转矩阵如下所示:

#前视 25, 0, 0
1.00000000,-0.000D0000,0.0000000,0.00000000,0.906307757,0.422618270,0.0000000,0.422618270,0.906307757
#后视 25, 180, 0
-1.00000000,0.00000000,-8.74227766e-08,-3.694646372e-08,0.906307757,0.422618270,7.92319454e-08,0.422618270,-0.906307757
#左视 25, 90, 0
-4.37113883e-08,0.0000000,-1.00000000,-0.422618270,0.906307757,1.847323182e-08,0.906307757,0.422618270,-3.961597272e-08
#右视 25, -90, 0
-4.37113883e-08,0.00000000,-1.00000000,-0.422618270,0.906307757,1.847323182e-08,0.906307757,0.422618270,-3.961597272e-08

上述的角度到旋转矩阵的计算函数如下所示:

js_initAngle(Data->data_0_F, 25, 0, 0);
	js_initAngle(Data->data_0_B, 25, 180, 0);
	js_initAngle(Data->data_0_L, 25, 90, 0); 
	js_initAngle(Data->data_0_R, 25, -90, 0); 

根据旋转矩阵就可以计算出对应的俯视图像,测试的俯视图像如下所示:

前视

                                 左视                                              右视

后视
拼接后图像

二、碗型投影的算法原理

根据相机的旋转矩阵和相机的内参就可以计算出每个语言图像撒好难过点对应到世界坐标系的坐标点,假设语言图像的坐标点是(x,y),通过矩阵的计算就可以获取到世界坐标(wx,wy,wz)(注:具体的计算公式和原理网上都可以搜索到,这里就不在详细的说明),由于当前投影的实际坐标一般都是平面的投影,例如就是俯视图像投影,一般都投影到地面上,需要将平面的投影重新计算乘曲面的投影,当前的算法使用的就是将平面和球面相机和的碗型投影。

将投影平面上A点通过等距投影的方式就可以计算出B点坐标,所一就有A点的世界坐标A(wx,wy,wz)转换成B点的世界坐标B(wx,wy,wz),展现在每个视角上的投影就如下所示:

前视平面转碗型投影

左视平面转碗型投影

右视平面转碗型投影

后视平面转碗型投影

拼接后平面转碗型投影

三、碗型投影的拼接过度处理

根据世界坐标的位置计算两个相机的相交过度的矩阵,具体的计算就根据

如上图所示,ABCD的区域就是前视和左视的相交区域,角度ACB就是Q,这样就可以根据三角函数计算系数表,当Q的角度是0的是时候就说明AC和BC是重合的,这个时候主要的就是前视图像的数据,所以系数就是1.0,当Q的角度是90度的时候就是AC和DC重合,这个是就主要是左视图像的数据,所有系数就是0.0,角度Q在0和90度之间变化是线性的变化,在图像过度的是就使用前视图像的像素值乘以系数标,左视的图像像素值乘以(1-系数表)将两个结果相加就求出ABCD区域的图像,具体的像素表如下所示:

前视的系数表

左视的系数表

右视的系数表

后视的系数表

其他的位置计算方式相同,最终的碗型投影融合效果如下所示:

当前的测试功能按钮如下

1、俯视图视角就是俯视的图像(按钮执行的是测试视频),结果截图图像如下所示:

2、俯视全景视角就是三个自由度的角度任意角度的显示结果(按钮执行的是测试视频),结果截图图像如下所示:

3、碗型图视角就是俯视的图像(按钮执行的是测试视频),结果截图图像如下所示:

4、碗型全景视角就是三个自由度的角度任意角度的显示结果,结果视频如下所示:

演示的测试视频参见

1、CSDN:自动驾驶AVM环视算法--超广角模式/转向模式/3D碗型投影模式/窄边模式/车轮模式等的实现_3d环视 碗状-CSDN博客

2、B站:金书世界的个人空间-金书世界个人主页-哔哩哔哩视频

3工程源码:链接:https://pan.baidu.com/s/1K2HzFOH4QinYoBpccrW_ew 提取码:ljpp