为什么有3个冲突的OpenCV相机校准公式?

Joh*_*ohn 12 math opencv formula camera-calibration

我遇到了OpenCV用于摄像机校准目的各种坐标参数化问题.问题是关于图像失真公式的三个不同信息来源显然给出了涉及的参数和方程的三个非等效描述:

(1)在他们的 "学习OpenCV ......"一书中,Bradski和Kaehler写了关于镜头失真的文章(第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 ],
Run Code Online (Sandbox Code Playgroud)

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

据推测,(x,y)是未校正捕获图像中与世界点对象相对应的像素坐标,坐标为(X,Y,Z),参考相框,

xcorrected = fx * ( X / Z ) + cx    and     ycorrected = fy * ( Y / Z ) + cy,
Run Code Online (Sandbox Code Playgroud)

其中fx,fy,cx和cy是相机的内在参数.因此,通过应用上述前两个校正表达式,从捕获的图像得到(x,y),我们可以获得所需的坐标(x校正,y校正)以产生捕获的世界场景的未失真图像.

然而...

(2)当我们在相机校准和3D重建部分下查看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' ],
Run Code Online (Sandbox Code Playgroud)

其中r'= sqrt(x'^ 2 + y'^ 2),最后是那个

u = fx * x'' + cx,

v = fy * y'' + cy.
Run Code Online (Sandbox Code Playgroud)

可以看出,这些表达式与#1中的表达式不同,结果是两组校正坐标(x校正,y校正)和(u,v)不相同.为什么矛盾?在我看来,第一组更有意义,因为我可以将物理意义附加到那里的每一个x和y,而我发现没有物理意义在x'= X/Z和y'= Y/Z时相机焦点长度不完全是1.此外,我们不知道(X,Y,Z),不能计算x'和y'.

(3)遗憾的是,当我们参考英特尔开源计算机视觉库参考手册的镜头失真(第6-4页)中的文章时,事情变得更加模糊,其中部分说明:

"让(u,v)成为真正的像素图像坐标,即具有理想投影的坐标,(u,v)是对应的实际观察(失真)图像坐标.同样,(x,y)是理想的(失真) -free)和(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 ) ],
Run Code Online (Sandbox Code Playgroud)

其中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 ) ]
Run Code Online (Sandbox Code Playgroud)

后一种关系用于从相机中取消失真图像."

好吧,似乎涉及x和y的表达式与本文顶部给出的涉及xcorrected和ycorrected的两个表达式一致.然而,根据给出的描述,x和y不是指校正的坐标.我不理解坐标(x,y)和(u,v)的含义之间的区别,或者对于(x,y)和(u,v)对之间的区别.从它们的描述看来,它们唯一的区别是(x,y)和(x,y)指的是"物理"坐标,而(u,v)和(u,v)则没有.这个区别到底是什么?它们不是所有物理坐标吗?我迷路了!

感谢您的任何意见!

Dou*_*oug 3

相机标定没有唯一的公式,它们都是有效的。请注意,第一个包含 r^2、r^4 和 r^6 的常量 K1、K2 和 K3,而另外两个仅包含 r^2 和 r^4 的常量?那是因为它们都是近似模型。第一个可能更准确,因为它有更多参数。

任何时候你看到:

r = sqrt( x^2 + y^2 )
Run Code Online (Sandbox Code Playgroud)

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

顺便问一下你想做什么?估计相机参数,校正镜头畸变,或两者兼而有之?