3

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

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

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

我的方法完全错误吗,我只是把方程式弄乱了吗?(在 wolframalpha.com 的帮助下解决)有没有更简单或更好的方法来做到这一点?任何帮助都将不胜感激,因为我有点迷茫并且在一些时间压力下:-/谢谢,大卫

4

2 回答 2

2

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

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

所以我的猜测是我需要一个变换矩阵,将每个点与它相乘,这样我就有一个新的坐标系,它位于桌子表面上。

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

  1. T_table 表示标记在表引用中的坐标,
  2. T_camera 表示相机参考中的表坐标。

从单个 2d 图像中找到 T_camera 很困难,因为没有深度信息。

这被称为姿势问题——Daniel DeMenthon 等人对此进行了研究。他开发了一种快速且稳健的算法来找到物体的姿势:

  • 可在其研究主页上找到文章,第 4 节“基于模型的对象姿势”(尤其是“25 行代码中基于模型的对象姿势”,1995 年);
  • 代码在同一个地方,“POSIT(C 和 Matlab)”部分。

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

于 2009-09-17T17:32:20.807 回答
0

If you know the location in the physical world of your four markers and you've recorded the positions as they appear on the camera, you ought to be able to derive some sort of transform.

When you do the calibration, surely you'd want to put the marker at the four corners of the table not the screen? If you're just doing the corners of the screen, I imagine you're probably not taking into acconut the slant of the table.

Is the table literally just slanted relative to the camera or is it also rotated at all?

于 2009-09-14T12:58:48.907 回答