坐标转换C ++

时间:2009-09-14 12:32:25

标签: c++ matrix coordinates transform openscenegraph

我有一个网络摄像头指向倾斜的桌子,我跟踪标记。 我在OpenSceneGraph中有一个transformationMatrix,它的翻译部分包含从跟踪对象到相机的相对坐标。 因为相机指向倾斜,当我在桌子上移动标记时,Y轴和Z轴会更新,尽管我想要更新的是Z轴,因为标记的高度不会改变它到达的距离。相机。 当在OpenSceneGraph中的标记上投影模型时,模型稍微关闭,当我移动标记时,Y和Z值的更新不正确。

所以我的猜测是我需要一个变换矩阵,我将每个点乘以一个新的坐标系统,它在桌面上正交。 这样的事情:A * v1 = v2 v1是摄像机坐标,v2是我的“桌面坐标” 所以我现在所做的就是选择了4分来“校准”我的系统。所以我将标记放在屏幕的左上角,并将v1定义为当前相机坐标,将v2定义为(0,0,0),我为4个不同点进行了此操作。 然后从我有一个未知矩阵和两个已知向量得到的线性方程我解决了矩阵。

我认为矩阵得到的值将是我需要乘以摄像机坐标所需的值,因此模型会在标记上正确更新。 但是当我将之前收集的已知相机坐标与矩阵相乘时,我没有得到任何接近我的“桌坐标”的东西。

我的方法是完全错误的吗?我只是把方程式弄得一团糟吗? (在wolframalpha.com的帮助下解决)有更简单或更好的方法吗? 任何帮助将不胜感激,因为我有点失落,并在一段时间的压力下: - / 谢谢, 大卫

2 个答案:

答案 0 :(得分:2)

  

当我在桌子上移动标记时,Y和Z轴会更新,尽管我想要更新的是Z轴,因为标记的高度不会改变它到相机的距离。

仅当相机的视图方向与Y轴(或Z轴)对齐时才为true。如果摄像机未与Y对齐,则意味着变换将围绕X轴应用旋转,从而修改标记的Y和Z坐标。

  

所以我的猜测是我需要一个变换矩阵,我将每个点乘以一个新的坐标系统,它在桌面上正交。

是的。之后,您将有2个转换:

  1. T_table表示表格参考中的标记坐标,
  2. T_camera表示相机参考中的表格坐标。
  3. 从单个2d图像中查找T_camera很难,因为没有深度信息。

    这被称为Pose问题 - 它已被其他人研究过--Daniel De Menthon。他开发了一种快速而强大的算法来查找对象的姿势:

    • 文章research homepage,第4节“基于模型的对象姿势”(特别是“25行代码中基于模型的对象姿势”,1995);
    • the same place处的代码,“POSIT(C和Matlab)”部分。

    请注意,OpenCv库提供了DeMenthon算法的实现。该库还提供了一个方便易用的界面,可以从网络摄像头中抓取图像。值得一试:OpenCv homepage

答案 1 :(得分:0)

如果您知道四个标记物理世界中的位置,并且您已经记录了相机上显示的位置,那么您应该能够获得某种变换。

进行校准时,您肯定要将标记放在桌子的四个角落而不是屏幕上吗?如果你只是在屏幕的角落,我想你可能没有考虑到桌子的倾斜。

表格是否只是相对于相机倾斜,还是完全旋转?