如果已知外参和内参参数,如何从2D图像像素获取3D坐标

40

我正在使用Tsai算法进行相机校准。我得到了内参和外参矩阵,但是如何从这些信息中重构出3D坐标?

enter image description here

1) 我可以使用高斯消元法来求解X、Y、Z、W,然后将点表示为齐次系统的X/W、Y/W、Z/W。

2) 我可以使用OpenCV文档的方法:

enter image description here

由于我知道uvRt,因此我可以计算X,Y,Z

然而,这两种方法得出的结果不正确。

我做错了什么?


非常好的答案,请如果这个答案有帮助,请将其标记为正确。 - vgonisanz
2个回答

36
如果您有外部参数,则已经拥有了一切。这意味着您可以从外部参数(也称为相机姿态)获取单应性矩阵。姿态是一个3x4矩阵,单应性矩阵是一个3x3矩阵,用H表示。
                   H = K*[r1, r2, t],       //eqn 8.1, Hartley and Zisserman

当中K代表相机内部矩阵,r1r2是旋转矩阵的前两列,Rt是平移向量。

然后通过t3进行归一化处理。

第三列r3发生了什么?我们不使用它吗?不,因为它是姿态的前两列的叉积,所以它是多余的。

现在你有了单应性,可以投影点了。你的二维点是x,y。将它们添加一个z=1,这样它们就变成了三维点。按以下方式对它们进行投影:

        p          = [x y 1];
        projection = H * p;                   //project
        projnorm   = projection / p(z);      //normalize

希望这能帮到您。

2
你是否写错了列?也许你的意思是(r12 r22 r32)和(r13 r23和r33)这两列? - EliteTUM
4
我不太了解"normalize"部分。p/p(z)会使所有点的z值为1,那么如何获得3D点? - Froyo
2
对于平面物体,此解决方案是正确的。对于非平面物体,您需要至少两个姿态来恢复物体坐标系中的3D点。 - user2311339
2
单应矩阵仅适用于平面场景,以及通过纯旋转获得的场景。基础矩阵/本质矩阵是一般情况下的解决方案,但您需要至少两个视角的场景,并且在这两个视角中都有点,正如user2311339所提到的。然后,您可以根据每个视角中匹配的一对2D点三角化3D点。 - rbaleksandar
2
请有人帮帮我,我不明白“投影/projection”或“p(z)”的含义在哪里可以找到“p(z)”的值?是哪个元素? - Rashed DIP
显示剩余5条评论

2

如上面的评论所述,将2D图像坐标投影到3D“相机空间”中,本质上需要编造z坐标,因为这些信息在图像中完全丢失。一种解决方案是在投影之前为每个2D图像空间点分配一个虚拟值(z = 1),如Jav_Rock所回答的。

p          = [x y 1];
projection = H * p;                   //project
projnorm   = projection / p(z);      //normalize

除了这种虚拟解决方案之外,还有一种有趣的替代方案是训练一个模型来预测每个点在重新投影到3D相机空间之前的深度。我尝试过这种方法,并且使用在KITTI数据集中训练的Pytorch CNN对3D边界框进行了高度成功的训练。如果需要代码,我很乐意提供,但贴在这里可能会有点冗长。


嘿 @DerekG,你能分享一下关于Pytorch/CNN方法的更多阅读资料链接吗?包括源代码...谢谢 :) - Pe Dro
这个仓库已经不再维护,但它还在那里。 - DerekG

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