3

我正在做一个项目,我只有一个静态相机(不移动),但有一个物体平面,上面有 3 个点(它是一个平面,所以 z 方向上的点之差为零)。相机始终在同一位置,平面在空间中移动和旋转。我已经用 25 个棋盘图像和功能校准了相机:

calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs,      tvecs);

并且不失真效果很好。现在我制作了 opencv (c++) 将内在函数和 distCoeffs 写入 xml 文件。

如何在新程序中使用这些参数,找到形成三角形的 3 个点(用红外灯制成),并返回这个三角形的旋转和平移?

4

1 回答 1

1

2D案例

这部分答案仅讨论平面中的刚性运动,因此与问题不完全匹配。

假设您已经确定了您的观点,这似乎根据您的评论起作用。现在您可以计算这些点之间的距离并对它们进行排序。两个检测点之间的最短距离应对应于原始三角形的最短边,依此类推。有了这些信息,您可以将您的点标记为ABC

接下来,您移动(平移)所有点,以便之后一个点位于原点。这是假设您的原始三角形在原点有一个角。让我们假设A在您的原始三角形和移动的点集中都位于原点。这个向量的否定版本表示你的三角形的平移

现在轮换。假设对于您的原始三角形,B位于正x轴,即y = 0 且x > 0。现在您可以从相机中获取点Batan2的(移动)位置,并使用它的坐标,您可以确定直线ABx轴之间的角度。这就是三角形的旋转角度。

您可以将这两者结合起来形成仿射变换。如果您的原始三角形不是以A为原点,B位于x轴的正部分,那么您可以使用类似的技术来确定您的原始三角形如何与具有所述属性的三角形相关。

3D案例

对于空间中的刚性运动,我没有现成的解决方案。只是一个想法。假设您的相机位于原点,并且您分析的图像嵌入在z = 1 处。那么图像中的一个点 ( x , y ) 对应于该嵌入位置中的一个点 ( x , y , 1),并且穿过该点的光线由该坐标的倍数给出,即 ( λx , λy , λ )。因此,从图像中点ABC的位置开始,您可以根据每个点的单个变量计算空间中的对应点,例如a through

现在你的任务是选择这三个变量,使空间中点之间的距离与三角形的边长相匹配。这导致了一个由三个变量组成的三个方程组:

(a - b)^2 + (Ay*a - By*b)^2 + (Ax*a - Bx*b)^2 == AB^2
(a - c)^2 + (Ay*a - Cy*c)^2 + (Ax*a - Cx*c)^2 == AC^2
(b - c)^2 + (By*b - Cy*c)^2 + (Bx*b - Cx*c)^2 == BC^2

不幸的是,这些方程不是线性的。到处都是你的变量的正方形。简单地将它们输入计算机代数系统还没有为我提供明确的解决方案。我想可能有数字方法可以使用一些迭代过程找到近似值,但是您必须对此进行一些研究。

获得 3D 坐标后,通过这些坐标计算转换应该很简单。这完全取决于您希望描述旋转的格式。

于 2012-10-17T09:27:39.683 回答