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

问题描述 投票:0回答:3

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

enter image description here

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

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

enter image description here

据我所知

u
v
R
t
,我可以计算
X,Y,Z

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

我做错了什么?

c++ opencv camera-calibration homogenous-transformation pose-estimation
3个回答
36
投票

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

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

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

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

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

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

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

希望这有帮助。


2
投票

正如上面评论中所说,将 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 获得了高度成功。很乐意提供代码,但在这里发布会有点冗长。


0
投票

我已经尝试了所有方法来获取 3D 射线但没有坐标,这个博客帮助了我 https://www.reddit.com/r/computervision/comments/1859k52/get_3d_ray_equation_from_2d_pixel_cooperative/

© www.soinside.com 2019 - 2024. All rights reserved.