C++ 坐标变换C++;

C++ 坐标变换C++;,c++,matrix,coordinates,transform,openscenegraph,C++,Matrix,Coordinates,Transform,Openscenegraph,我有一个网络摄像头,指向一张倾斜的桌子,我用它跟踪标记。 我在OpenSceneGraph中有一个transformationMatrix,它的平移部分包含从跟踪对象到相机的相对坐标。 因为相机指向一个斜面,所以当我在桌子上移动标记时,Y轴和Z轴都会更新,尽管我只想更新Z轴,因为标记的高度不会改变它到相机的距离。 当在OpenSceneGraph中的标记上投影模型时,该模型稍微关闭,并且当我在Y和Z值周围移动标记时,该效果不正确 所以我想我需要一个变换矩阵,我用它乘以每个点,这样我就有了一个新的

我有一个网络摄像头,指向一张倾斜的桌子,我用它跟踪标记。 我在OpenSceneGraph中有一个transformationMatrix,它的平移部分包含从跟踪对象到相机的相对坐标。 因为相机指向一个斜面,所以当我在桌子上移动标记时,Y轴和Z轴都会更新,尽管我只想更新Z轴,因为标记的高度不会改变它到相机的距离。 当在OpenSceneGraph中的标记上投影模型时,该模型稍微关闭,并且当我在Y和Z值周围移动标记时,该效果不正确

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

我以为矩阵的值就是我需要乘以摄像机坐标的值,这样模型才能在标记上正确更新。 但是,当我将之前收集的已知摄像机坐标乘以矩阵时,我没有得到任何接近我的“表坐标”的结果

我的假设是不是完全错了,我是不是把方程搞砸了?(在wolframalpha.com的帮助下解决)有更简单或更好的方法吗? 任何帮助都将不胜感激,因为我有点迷路了,而且在一些时间压力下:-/ 谢谢
David

如果你知道你的四个标记在物理世界中的位置,并且你已经记录了它们在相机上出现的位置,你应该能够导出某种变换

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

桌子是相对于相机倾斜还是旋转

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

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

所以我想我需要一个变换矩阵,我用它乘以每个点,这样我就有了一个新的坐标系,它在桌子表面上是正交的

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

  • T_table表示表参考中的标记坐标
  • T_camera以表示摄影机参照中的表格坐标
  • 从单个2d图像中查找T_相机很困难,因为没有深度信息

    这就是所谓的姿势问题——丹尼尔·德曼森(Daniel DeMenthon)等人对此进行了研究。他开发了一种快速而稳健的算法来寻找物体的姿势:

    • its上的文章,第4节“基于模型的对象姿势”(尤其是“25行代码中基于模型的对象姿势”,1995年)
    • 代码位于“POSIT(C和Matlab)”部分

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

    如果有任何帮助,我使用的是osgART,它将ArToolkits跟踪和视频插件与OpenSceneGraph相结合。检查你的代数……你可能正在计算你的变换的倒数吗?感谢你的快速回答,相机看不到整个表格,表格只是我移动标记的表面。摄像机只是从一个角度指向桌子表面。因此,桌子角甚至不再出现在摄影机视图中。所以我试着去相机能看到的最远的地方。“屏幕”的角落如果你需要一张设置的图片,请问我,我会尽快把一张放在网上,谢谢,大卫不知道是不是这样。这是有道理的-听起来你可能是以正确的方式看待这个问题的。你有没有试过在桌子上放一个规则的网格,以确保图像边缘没有桶形失真?有可能网络摄像头向角落的弯曲程度更高,这可能会影响您的校准?嘿,谢谢你的回答。我已经成功地创建了一个矩阵,它可以在我的网络摄像头为我提供的标记位置坐标和我的桌子坐标之间进行转换。但我不太确定接下来该怎么办。如果我只取这些新的点,它会将模型投影到相机的正前方,而不是在标记上。如果我把它翻译到标记上,它仍然会不正确地更新。问题是它会根据显示器的反射进行更新,显示器基本上与显示器成90°角(与玻璃面板成45°角),而不是笔直地放在桌子上。有什么想法吗?抱歉有两个部分的评论:)所以它沿着投影图像正确更新,但我希望它沿着表格正确更新。我被告知将摄像机坐标系转换到视图平面的原点(应该是反射监视器原点的原点),然后从那里乘以逆摄像机矩阵。这将完全忽略我创建的矩阵,它在我创建的坐标系和