从广角(180)相机拍摄的图像中消除镜头失真

时间:2014-11-19 09:23:50

标签: image opencv opengl image-processing gimp

我有一些从广角appx捕获的图像。 (180度)相机。 我正在使用opencv 2.4.8,它提供了有关相机矩阵n失真矩阵的一些细节。

MatK = [537.43775285, 0, 327.61133999], [0, 536.95118778, 248.89561998], [0, 0, 1]
MatD = [-0.29741743, 0.14930169, 0, 0, 0]

此信息我已进一步用于消除失真。 但结果并不像预期的那样。 我附上了一些我用来校准的棋盘输入图像。 或者是否有任何其他工具或库可以将其删除。

输入图片

testImg1

testImg2 testImg3 testImg4

来自普通相机的

,甚至是我的智能手机拍摄 without Distortion without Distortion without Distortion

3 个答案:

答案 0 :(得分:4)

这不是问题的答案,而是关于"讨论"变形和平面度。

实际上,你在模式上有一些直线:

enter image description here

使用(几乎任何)镜头,你会得到某种扭曲,这样在投影到你的图像后,这些直线就不再是直的了。对于广角镜头来说,这种效果要强得多。你可以期待这样的事情(广角更强但相似):

enter image description here

但是你提供的图像看起来更像是这样,这可能是因为你的图案在地面上并不是真正的平面,或者因为镜头有一些额外的"丘陵"在你的镜头上。

enter image description here

答案 1 :(得分:1)

校准过程的全部要点是告诉OpenCV在变形下的直线是什么样的。棋盘用于呈现易于OpenCV检测的多条直线。在您的图像中,这些线条根本不直。我非常确定OpenCV还需要方盒。

所以,使用真正的棋盘图案。打印出来,将其粘在一块木头或硬塑料或其他任何东西上。但要确保它在平面上是常规的棋盘图案。

答案 2 :(得分:0)

最常见的方法(例如Oculus Rift Runtime使用)绘制足够精细的纹理网格,选择纹理坐标或网格节点位置来补偿失真。为了获得网格,通常将多项式或样条拟合到某个参考图像。例如,相机中的棋盘是一个常见的校准目标。