我有一台经过校准的相机,并且具有固有参数。我还具有相对于现实世界中平面上的点(世界原点)的外部参数。我已将此点设置为真实世界坐标[0,0,0]中的原点,且法线为[0,0,1]。

从这些外部参数中,我可以算出相机在此处使用3d坐标在世界平面3d坐标中的位置和旋转:http://en.wikipedia.org/wiki/Camera_resectioning

现在我有了第二个点,我已经提取了[x ,y]。现在如何获得该点在世界坐标系中的3d位置?

我的直觉是我必须追踪从相机的光学中心发出的光线(现在具有如上所述的3D位置),通过相机的图像平面[x,y],然后通过我在顶部定义的真实世界平面。

现在我可以与以我所知的法线在一个平面上协调3d射线并指向该平面。我没有得到的是我如何找出3d位置和方向通过像素离开图像平面时的情况。是通过不同坐标系进行的转换使我感到困惑。

评论

检查此答案,可能会有所帮助。如果您认为任何事情可以/可能完成,请告诉我。 dsp.stackexchange.com/a/2737/1473

#1 楼

如果您有外部知识,那么这很容易。具有外在性与具有“照相机姿势”相同,并且与具有单应性相同。在stackoverflow中查看此帖子。

您具有外部特性,也称为相机姿势,被描述为平移和旋转:

$ \ displaystyle Pose = \ begin {bmatrix } R | t \ end {bmatrix} = \ begin {bmatrix} R_ {11}&R_ {12}&R_ {13}&t_x \\ R_ {21}&R_ {22}&R_ {23}&t_y \\ R_ {31}&R_ {32}&R_ {33}&t_z \ end {bmatrix} $

您可以通过Pose通过以下方式获取同形文字:

$ \ displaystyle H = \ frac {1} { t_z} \ begin {bmatrix} {R_ {1x}}&{R_ {2x}}&{t_x} \\ {R_ {1y}}&{R_ {2y}}&{t_y} \\ {R_ {1z} }&{R_ {2z}}&{t_z} \ end {bmatrix} $

然后,您可以通过将Homography乘以点,将2D点投影到相应的3D点中:

$ p_ {2D} = \ begin {bmatrix} x&y&1 \ end {bmatrix} \ quad $加$ \ quad z = 1 \ quad $以使它们同构

$ p_ {3D} = H * p_ {2D} $

$ p = p / p(z)\ quad $归一化点

评论


$ \ begingroup $
这里的p(z)是什么意思?
$ \ endgroup $
–百乐
20 Mar 30 '20 at 9:03

#2 楼

您有两个选择,可以使用反投影或在两个平面之间进行投影(单应性)。点:

$$
P = K \开始{bmatrix} R和-R \ textbf {C} \ end {bmatrix}
\\
\ textbf {X} _ {reprojected} = P ^ + \ textbf {x}
$$

现在您有了一条3D线,该线穿过相机中心$ \ textbf {C} $并指向$ \ textbf {X} $。如果需要,可以将其转换为更易于处理的演示文稿。例如,使用一个点和方向矢量(记住要标准化同质坐标$ \ textbf {V} = \ omega \ begin {bmatrix} X&Y&Z&1 \ end {bmatrix} ^ T $,这样比例因子$ \ omega = 1 $,然后再进行实际计算):

$$
\ textbf {u} = \ textbf {X} _ {reprojected}-\ textbf {C} \\
\ textbf {v} = \ frac {\ textbf {u}} {\ | \ textbf {u} \ |} \\
\ textbf {L}(t)= \ textbf {C} + t \ textbf {v}
$$

如果您有飞机$ \ Pi = \ begin {bmatrix} \ pi_1&\ pi_2&\ pi_3&\ pi_4 \ end {bmatrix} ^ T,\ pi_1X + \ pi_2Y + \ pi_3Z + \ pi_4 = 0 $您可以为$ t $解方程$ \ textbf {L}(t)= \ Pi $。

如果您决定使用单应性,则需要计算$ 3 \ times3 $单应性矩阵$ H $,其定义为成像平面与相机传感器平面之间的投影:

$$
\ textbf {X} _ {plane} = \ begin {bmatrix} X&Y&0&1 \ end {bmatrix} ^ T \\
\ textbf {x} = P \ textbf {X} _ {plane}
= H \ begin {bmatrix} X&Y&1 \ end {bmatrix} ^ T
$$

现在,如果您知道$ \ textbf {x} $:
$$
\ textbf {X} _ {plane} = H ^ {-1} \ textbf {x}
$$

如果在校准摄像机时未计算$ H $(可能使用直接线性变换DLT),则可以使用以下公式:

$$
H = R + \ frac {1} {d} \ textbf {T} \ textbf {N} ^ T
$$

其中$ d $是相机与飞机的距离,而$ \ textbf {T} = -R \ textbf {CMa,Soatto,Kosecká,Sastry-邀请从图像到几何模型的3D视觉,第。 132)

#3 楼

您无法知道第二点的3d位置。它可以是从相机中心到无限远的任何光线点。

您可以执行以下操作:


创建类似于现实生活场景的预定义3d空间
从不同角度获取更多的图像点,使用不同角度的光线的交点,可以获得3d点的近似值。


评论


$ \ begingroup $
等一下我能找到3d射线与平面相交的3d世界点吗?据我所知,该平面的3d世界坐标和3d世界法线.....我试图找到的3d点是与平面相交的点! (抱歉,我的解释不够好)
$ \ endgroup $
–猎豹
2012年3月30日9:39



$ \ begingroup $
什么是平面?图像平面还是零世界坐标平面?对于后者,您可以计算交点,但这意味着您的3d场景不是3d,而是2d:)(因为它是一个平面)。
$ \ endgroup $
– Geerten
2012年3月30日在9:45

$ \ begingroup $
对不起,我只是没有想到。我了解您在说什么,从视觉上来说对我来说真的没有任何意义。因此,是的,我的场景实际上是“ 2d”,因为我有图像平面,也有真实世界平面,真实世界原点[0,0,0]位于该平面上,并且真实世界法线为[0,0, 1],因此位于此现实世界平面上的每个点的形式均为[x,y,0]。我知道我可以通过ax + by + cz + d = 0来计算交集,但这就是我遇到的麻烦。 (将在下一条评论中继续)
$ \ endgroup $
–猎豹
2012年3月30日上午10:09

$ \ begingroup $
我有一条光线从相机中心/原点开始,具有真实世界[x,y,z]和真实世界法线[nx,ny,nz]。我需要从这一点发射一条光线,该光线在[u,v]处与图像平面相交,然后在[x,y,0]处与真实世界平面相交(正是我想要得到的x,y)。我遇到的麻烦是第一点,即与图像平面的交点。我看不到我该怎么做?
$ \ endgroup $
–猎豹
2012年3月30日上午10:15

$ \ begingroup $
您可能要看一下:en.wikipedia.org/wiki/Line-plane_intersection
$ \ endgroup $
– Geerten
2012年3月30日,11:10