我遇到了 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 ],
其中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是摄像机的内部参数。因此,通过应用上述前两个校正表达式,从捕获的图像中得到(x,y),我们可以获得所需的坐标(x校正,y校正),以产生捕获的世界场景的未失真图像。
...然而
(2)当我们查看Camera Calibration and 3D Reconstruction部分下的OpenCV 2.0 C Reference条目时,会出现复杂情况。为了便于比较,我们从相对于相机参考帧表示的所有世界点(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中的表达式不同,结果是两组校正坐标(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)为理想(无失真)和(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)则没有。这个区别到底是什么?它们不是所有物理坐标吗?我迷路了!
感谢您的任何意见!
答案 0 :(得分:3)
没有唯一的相机校准公式,它们都是有效的。注意第一个包含常数K1,K2和amp; K3代表r ^ 2,r ^ 4& r ^ 6,另外两个只有r ^ 2和r ^ 4的常数?那是因为它们都是近似模型。第一个可能更准确,因为它有更多的参数。
任何时候你看到:
r = sqrt( x^2 + y^2 )
假设x =(x坐标像素) - (相机中心以像素为单位)可能是安全的,因为r通常表示距离中心的半径。
顺便说一下,你打算做什么?估计相机参数,校正镜头失真,或两者兼而有之?