为什么存在三种相互冲突的OpenCV相机标定公式?

12
我在使用OpenCV进行相机校准时遇到了问题,主要涉及到坐标的不同参数化方式。问题在于三个不同的图像畸变公式来源似乎给出了三种不等价的参数和方程式描述:
(1)在Bradski和Kaehler的书“学习OpenCV…”中,他们关于镜头失真的描述(第376页):
xcorrected = x * ( 1 + k1 * r^2 + k2 * r^4  + k3 * r^6 ) + [ 2 * p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ],

ycorrected = y * ( 1 + k1 * r^2 + k2 * r^4  + k3 * r^6 ) + [ p1 * ( r^2 + 2 * y^2 ) + 2 * p2 * x * y ],

其中 r = sqrt( x^2 + y^2 )。

可能,(x, y) 是未校正捕获图像中与世界点对象坐标 (X, Y, Z) 相对应的像素坐标,相对于摄像头框架参考,并满足以下条件:

xcorrected = fx * ( X / Z ) + cx    and     ycorrected = fy * ( Y / Z ) + cy,

其中,fx、fy、cx和cy是相机的内部参数。因此,当我们有一张拍摄图像时,通过应用以上前两个校正表达式,我们可以获得所需的坐标(xcorrected、ycorrected),从而生成一个未畸变的捕捉到的世界场景图像。

然而...

(2) 复杂之处在于查看OpenCV 2.0 C参考文献中相机校准和三维重建部分的条目。为了方便比较,我们从所有世界点(X、Y、Z)坐标都是相对于相机参考框架来表示的开始,就像#1中一样。因此,变换矩阵[R | t]并不重要。

C参考文献中表述如下:

x' = X / Z,

y' = Y / Z,

x'' = x' * ( 1 + k1 * r'^2 + k2 * r'^4  + k3 * r'^6 ) + [ 2 * p1 * x' * y' + p2 * ( r'^2 + 2 * x'^2 ) ],

y'' = y' *  ( 1 + k1 * r'^2 + k2 * r'^4  + k3 * r'^6 ) + [ p1 * ( r'^2 + 2 * y'^2 )  + 2 * p2 * x' * y' ],

其中 r' = sqrt(x'^2 + y'^2),最终得出

u = fx * x'' + cx,

v = fy * y'' + cy.

如图所示,这些表达式不等同于#1中呈现的那些表达式,因此两组修正后的坐标 ( xcorrected, ycorrected ) 和 ( u, v ) 并不相同。为什么存在矛盾?在我看来,第一组更有意义,因为我可以为其中每个x和y附加物理含义,而当相机焦距不恰好为1时,我在 X/Z 和 Y/Z 中找不到任何物理含义。此外,我们无法计算 x' 和 y' ,因为我们不知道(X, Y, Z)。
(3) 不幸的是,当我们参考英特尔开源计算机视觉库参考手册中镜头畸变部分(page 6-4)的写作时,情况变得更加混乱,其中部分说明如下:
"设 ( u, v ) 为真实像素图像坐标,即具有理想投影的坐标,而 (u ̃, v ̃ ) 是对应的实际观测(畸变)图像坐标。同样地,( x, y ) 是理想(无畸变)坐标,而(x ̃, y ̃ )是实际(畸变)图像物理坐标。考虑两个扩展项,给出以下结果:"
x ̃  =  x * ( 1 +  k1 * r^2 + k2 * r^4 ) + [ 2 p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ] 

y ̃  =  y * ( 1 +  k1 * r^2 + k2 * r^4 ] + [ 2 p2 * x * y + p2 * ( r^2 + 2 * y^2 ) ],

其中 r = sqrt( x^2 + y^2 )。...

"由于 u ̃ = cx + fx * u,v ̃ = cy + fy * v,因此结果系统可以重写为以下形式:

u ̃  = u + ( u – cx ) * [ k1 * r^2 + k2 * r^4 + 2 * p1 * y + p2 * ( r^2 / x + 2 * x ) ]

v ̃  = v + ( v – cy ) * [ k1 * r^2 + k2 * r^4 + 2 * p2 * x + p1 * ( r^2 / y + 2 * y ) ]

后者关系用于从摄像头中矫正图像。

好吧,看起来涉及 x ̃ 和 y ̃ 的表达式与本文顶部给出的两个涉及 xcorrected 和 ycorrected 的表达式相同。然而,根据给定的描述, x ̃ 和 y ̃ 并不是指已校正的坐标。我不理解坐标 ( x ̃, y ̃ ) 和 ( u ̃, v ̃ ) 或者 ( x, y ) 和 ( u, v ) 之间的区别。从它们的描述中,它们唯一的区别似乎在于 ( x ̃, y ̃ ) 和 ( x, y ) 是“物理”坐标,而 ( u ̃, v ̃ ) 和 ( u, v ) 不是。这个区别到底是什么?它们不都是物理坐标吗?我迷失了!

感谢任何帮助!

1个回答

3

相机的校准没有一种万能的公式,它们都是有效的。注意第一个公式包含常数K1、K2和K3,用于r^2、r^4和r^6,而另外两个公式只有r^2和r^4的常数?这是因为它们都是近似模型。第一个公式可能更准确,因为它具有更多的参数。

每当你看到:

r = sqrt( x^2 + y^2 )

可以假设 x =(像素中的x坐标)-(相机中心的像素),因为r通常表示距离中心的半径。

顺便问一下,你想要做什么?估计相机参数,矫正镜头畸变还是两者都要?


感谢Doug的回复。不幸的是,我可能没有清楚地表述问题,因为您似乎错过了三种公式之间争议点的重点。这里关注的不是各种逼近中使用的项数的差异,而是,事实上——至少我认为——这三个不同的公式在数学上并不等价(即使假设它们都具有相同数量的逼近项)。我正在尝试编写一个程序,根据给定的fx、fy、cx和cy来纠正相机畸变。约翰 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接