OpenGL(八)——图像逆透视算法IPM

目录

一、前言

二、相机模型

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得来,实际上是整体矩阵的逆变换,在这里对其代码算法步骤进行总结:

  1. 根据摄像机厂家产品技术手册,获取相机FOV角度α,焦距f
  2. 通过标准网格板标定出相机内参矩阵、相机高度h;通过摄像机与车辆坐标系安装位置标定出外参矩阵;
  3. 通过外参矩阵分离出旋转矩阵R,从而计算出相机姿态,俯仰角θ
  4. 基于相机姿态计算消失点, 从而得出图像像素的uv范围uvLimit
  5. 通过像素------>世界的坐标转换,uvLimit计算出水平坐标系xyLimit;
  6. 已知xyLimit和IPM成像范围,通过世界------>像素的坐标转换,计算理论图像uv映射uvMap
  7. 已知原始图像、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博客

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值