我正在使用 tsai algo 进行相机校准。我得到了内在和外在矩阵,但是如何从该信息重建 3D 坐标?
1) 我可以使用高斯消去法来找到 X,Y,Z,W,然后点将是 X/W , Y/W , Z/W 作为齐次系统。
2) 我可以使用
OpenCV 文档 方法:
据我所知
u
,v
,R
,t
,我可以计算X,Y,Z
。
然而,这两种方法最终都会得到不正确的不同结果。
我做错了什么?
如果你得到了外部参数,那么你就得到了一切。这意味着您可以从外部获得单应性(也称为 CameraPose)。 Pose 是一个 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
希望这有帮助。
正如上面评论中所说,将 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 获得了高度成功。很乐意提供代码,但在这里发布会有点冗长。
我已经尝试了所有方法来获取 3D 射线但没有坐标,这个博客帮助了我 https://www.reddit.com/r/computervision/comments/1859k52/get_3d_ray_equation_from_2d_pixel_cooperative/