将2D图像点转换为3D世界点
computer-vision
opencv
7
0

我知道在一般情况下,由于深度信息会从3d丢失到2d,因此无法进行这种转换。

但是,我有一个固定的相机,我知道它的相机矩阵。我还有一个已知尺寸的平面校准图案-假设在世界坐标系中它具有角(0,0,0)(2,0,0)(2,1,0)(0,1,0)。使用opencv,我可以估计图案的姿势,并提供将对象上的点投影到图像中的像素所需的平移和旋转矩阵。

现在:这种从3d到图像的投影很容易,但是反过来呢?如果我在图像中选择一个我知道是校准图案一部分的像素,那么如何获得相应的3d点?

我可以迭代地在校准图案上选择一些随机的3d点,投影到2d,然后根据误差细化3d点。但这似乎太可怕了。

鉴于这个未知点的世界坐标为(x,y,0)-因为它必须位于z = 0平面上-似乎应该进行一些变换才能应用,而不是进行无意义的迭代。我的数学不是很好-有人可以算出这个变换并解释您如何得出它吗?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

是的你可以。如果您有一个将3d世界中的点映射到图像平面的变换矩阵,则可以使用此变换矩阵的逆矩阵将图像平面点映射到3d世界点。如果您已经知道3d世界点的z = 0,则将得出该点的一种解决方案。无需迭代选择一些随机3d点。在将摄像机安装在具有已知位置和摄像机校准矩阵的车辆上时,我遇到了类似的问题。我需要知道在相机的图像位置上捕获的车道标记的真实世界位置。

收藏
评论

这是一个封闭式解决方案,希望对您有所帮助。使用上面注释中的图像约定,您可以使用居中归一化的像素坐标(通常在畸变校正之后)的u和v以及外部校准数据,如下所示:

|Tx|   |r11 r21 r31| |-t1|
|Ty| = |r12 r22 r32|.|-t2|
|Tz|   |r13 r23 r33| |-t3|

|dx|   |r11 r21 r31| |u|
|dy| = |r12 r22 r32|.|v|
|dz|   |r13 r23 r33| |1|

使用这些中间值,所需的坐标为:

X = (-Tz/dz)*dx + Tx
Y = (-Tz/dz)*dy + Ty

说明:

向量[t1,t2,t3] t是世界坐标系原点(校准图案的(0,0))相对于相机光学中心的位置;通过反转符号并反转旋转变换,我们可以获得矢量T = [Tx,Ty,Tz] t ,它是摄像机中心在世界参考框架中的位置。

类似地,[u,v,1] t是向量,在该向量中位于相机参考系中的观察点(从相机中心开始)。通过反转旋转变换,我们获得向量d = [dx,dy,dz] t ,它表示世界参考系中的相同方向。

为了使旋转变换逆,我们利用了旋转矩阵的逆为其转置( 链接 )的事实。

现在我们有了一条从点T开始具有方向向量d的线,该线与平面Z = 0的交点由第二组方程给出。注意,找到与X = 0或Y = 0平面或与之平行的平面的相交点同样容易。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号