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

时间:2011-10-20 12:47:12

标签: c++ opencv camera-calibration homogenous-transformation pose-estimation

我正在使用tsai algo进行相机校准。我有内在和外在的矩阵,但是如何从该信息中重建三维坐标呢?

enter image description here

1)我可以使用高斯消元法找到X,Y,Z,W,然后将X / W,Y / W,Z / W作为均匀系统。

2)我可以使用 OpenCV documentation方法:

enter image description here

据我所知uvRt,我可以计算X,Y,Z

然而,这两种方法最终都会产生不正确的结果。

我做错了什么?

2 个答案:

答案 0 :(得分:28)

如果你有外在参数,那么你就得到了一切。这意味着您可以使用extrinsics(也称为CameraPose)进行Homography。姿势是3x4矩阵,单应性是3x3矩阵, H 定义为

                   H = K*[r1, r2, t],       //eqn 8.1, Hartley and Zisserman

K 是相机内部矩阵, r1 r2 是旋转矩阵的前两列, R < /强>; t 是翻译向量。

然后将所有内容归一化 t3

r3 会发生什么,我们不使用它吗?不,因为它是多余的,因为它是2个第一列姿势的交叉积。

现在你有单应性,投射点数。你的2d分是x,y。添加一个z = 1,所以它们现在是3d。按如下方式投影:

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

希望这有帮助。

答案 1 :(得分:0)

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

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

此虚拟解决方案的一个有趣替代方法是训练模型以预测每个点的深度,然后再投影到3D相机空间中。我尝试了这种方法,并使用在KITTI数据集中的3D边界框上训练的Pytorch CNN取得了很大的成功。很乐意提供代码,但是在这里发布会有点冗长。