目录
一、前言
二、相机模型
2.1 针孔模型
2.2 相机外参
三、逆透视模型
四、算法总结
一、前言
透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
逆透视变换是透视变换的逆过程,主要是结合相机的内在和外在参数,将图像从图像坐标系映射到世界坐标系,从而消除透视影响对图像检测和识别任务的干扰和误差。
二、相机模型
2.1 针孔模型
建立相机模型的目的是为了得到世界坐标中某一点 到 相机坐标系下 图像像素的对应关系。
经过一些列推导(网上有很多,不再重复),得到相机模型:
上述公式表示 世界坐标------------------------------------------------------->像素坐标 转换,其中:
R表示从世界坐标到相机坐标的旋转矩阵,实际上就是相机的内外参数;内参表示相机本身固有特性,如焦距;外参表示位置特性,即在世界坐标系下的姿态。
P表示世界坐标系原点 在相机坐标系下的位置
α表示在x轴或者y轴放大系数
f表示相机焦距
Xw表示世界坐标系,Xc表示相机坐标系
u0,v0表示光轴中心线与图像平面交点位置,如相机坐标系下的成像点(x2,y2)经过电压放大、补偿变换后最终变成图像像素(u,v):
2.2 相机外参
相机标定主要是计算 相机 映射矩阵, 确定 3D 世界 中任意点在 2D 图像中的位 置。相机模型由内参和外参矩阵构成,内参表示工艺特性,外参表示相机位置特性。
上述针孔模型的外参矩阵描述为4x4:
通过推导得:
其中旋转矩阵R表示横摆角γ,侧倾角fai,俯仰角θ决定。
外参可以根据matlab工具箱计算:
三、逆透视模型
透视示意图为:
Xc表示相机坐标系,Xv表示车辆坐标系,车辆坐标系与世界坐标系原点重合。2α表示相机图像视野,任意世界坐标系点Xb,Yb在相机坐标系下投影为Bx,By,图像坐标系u方向每个像素尺寸为lu,v方向每个像素尺寸为lv,通过推导相机逆透视计算公式为:
上述变换表示 像素坐标------------------------------------------------------->世界坐标 转换,其中:
m,n表示图像高度、宽度
h,l,d表示相机相对车辆的高度、垂直和水平偏移量
ui,vi表示像素点索引
Xp,Yp表示图像ui,vi在车辆坐标系下对应的预估距离
四、算法总结
逆透视变换详解 及 代码实现(一)_既然如此的博客-CSDN博客这边博客很值得参考,写的也详细,但是仅仅给出了世界坐标到相机图像的变换,并没有说明旋转矩阵R,导致一些博友无法理解xyLimit得来,实际上是整体矩阵的逆变换,在这里对其代码算法步骤进行总结:
- 根据摄像机厂家产品技术手册,获取相机FOV角度α,焦距f
- 通过标准网格板标定出相机内参矩阵、相机高度h;通过摄像机与车辆坐标系安装位置标定出外参矩阵;
- 通过外参矩阵分离出旋转矩阵R,从而计算出相机姿态,俯仰角θ
- 基于相机姿态计算消失点, 从而得出图像像素的uv范围uvLimit
- 通过像素------>世界的坐标转换,uvLimit计算出水平坐标系xyLimit;
- 已知xyLimit和IPM成像范围,通过世界------>像素的坐标转换,计算理论图像uv映射uvMap
- 已知原始图像、uvMap通过线性插值计算出IPM最终图像
其他:
(一)实际应用
通常是首先得到目标在图片中的信息,通过图像坐标系(pixel)与像平面坐标系(x/mm,y/mm)的转换得到像平面坐标,已知相机内外参,通过相机与世界坐标系的转换得到世界坐标系下的位置
(二)插值算法
A:原图像像素坐标通过式2-19,在经过缩放比得到逆透视图像坐标,但该坐标一般是浮点数,显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。双线性插值如下所示
使用公式:int x=(i+0.5)*m/a-0.5;int y=(j+0.5)*n/b-0.5,来代替int x=i*m/a;int y=j*n/b;
双线性插值的优化:
在图像处理中,双线性插值算法的使用频率相当高,比如在图像的缩放中,在所有的扭曲算法中,都可以利用该算法改进处理的视觉效果。在数学上,双线性插值算法可以看成是两个变量间的线性插值的延伸。执行该过程的关键思路是先在一个方向上执行线性插值,然后再在另外一个方向上插值。考虑将该过程中的所有类似于1-x、1-y的变量放大合适的倍数,得到对应的整数,最后再除以一个合适的整数作为插值的结果
如有错误,感谢指正!
参考:
opencv实现逆透视GitHub-19.01:GitHub - oreillymedia/Learning-OpenCV-3_examples
https://www.cnblogs.com/star91/p/6012425.html——相机标定
https://blog.csdn.net/qq_35356190/article/details/79790042——视场角获得
相机模型详解_Hao_09的博客-CSDN博客——相机针孔模型详解
https://www.cnblogs.com/singlex/p/RotateMatrix2Euler.html——相机横摆俯仰侧倾角详解
http://www.cnblogs.com/funny-world/p/3162003.html——基本双线性插值
http://www.cnblogs.com/Imageshop/archive/2011/11/12/2246808.html——双线性插值的优化
一文带你搞懂相机内参外参(Intrinsics & Extrinsics) - 知乎 (zhihu.com)
逆透视变换详解 及 代码实现(一)_既然如此的博客-CSDN博客