38

我正在从 tsai algo 进行相机校准。我得到了内在和外在矩阵,但是如何从该信息中重建 3D 坐标?

在此处输入图像描述

1) 我可以使用高斯消除来找到 X、Y、Z、W,然后点将是 X/W、Y/W、Z/W 作为齐次系统。

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

在此处输入图像描述

据我所知u,,,,,我可以v计算RtX,Y,Z

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

我在做什么错?

4

2 回答 2

35

如果你有外部参数,那么你就得到了一切。这意味着您可以从外部获得 Homography(也称为 CameraPose)。Pose是一个3x4矩阵,单应性是一个3x3矩阵,H定义为

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

其中K是相机固有矩阵,r1r2是旋转矩阵R的前两列;t是平移向量。

然后将所有内容归一化除以t3

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

现在你有了单应性,投影点。你的二维点是 x,y。添加它们 az=1,所以它们现在是 3d。将它们投影如下:

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

希望这可以帮助。

于 2012-05-25T07:56:11.490 回答
1

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

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

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

于 2019-09-18T16:53:58.923 回答