我正在从 tsai algo 进行相机校准。我得到了内在和外在矩阵,但是如何从该信息中重建 3D 坐标?
1) 我可以使用高斯消除来找到 X、Y、Z、W,然后点将是 X/W、Y/W、Z/W 作为齐次系统。
2)我可以使用
OpenCV 文档方法:
据我所知u
,,,,,我可以v
计算R
。t
X,Y,Z
然而,这两种方法最终都会产生不正确的不同结果。
我在做什么错?
我正在从 tsai algo 进行相机校准。我得到了内在和外在矩阵,但是如何从该信息中重建 3D 坐标?
1) 我可以使用高斯消除来找到 X、Y、Z、W,然后点将是 X/W、Y/W、Z/W 作为齐次系统。
2)我可以使用
OpenCV 文档方法:
据我所知u
,,,,,我可以v
计算R
。t
X,Y,Z
然而,这两种方法最终都会产生不正确的不同结果。
我在做什么错?
如果你有外部参数,那么你就得到了一切。这意味着您可以从外部获得 Homography(也称为 CameraPose)。Pose是一个3x4矩阵,单应性是一个3x3矩阵,H定义为
H = K*[r1, r2, t], //eqn 8.1, Hartley and Zisserman
其中K是相机固有矩阵,r1和r2是旋转矩阵R的前两列;t是平移向量。
然后将所有内容归一化除以t3。
列r3会发生什么,我们不使用它吗?不,因为它是多余的,因为它是姿势的前 2 列的叉积。
现在你有了单应性,投影点。你的二维点是 x,y。添加它们 az=1,所以它们现在是 3d。将它们投影如下:
p = [x y 1];
projection = H * p; //project
projnorm = projection / p(z); //normalize
希望这可以帮助。
正如上面评论中所说的那样,将 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 获得了高度的成功。很乐意提供代码,但在这里发布会有点冗长。