gpt4 book ai didi

c++ - 如何找到由 3 个点和 3 个红外 LED 组成的三角形的旋转和平移

转载 作者:太空狗 更新时间:2023-10-29 23:07:26 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

二维案例

这部分答案只讨论了平面内的刚性运动,所以与问题不完全吻合。

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

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

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

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

3D案例

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

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

(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

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

有了 3D 坐标后,通过这些坐标计算变换应该比较简单。这完全取决于您想要的旋转描述格式。

关于c++ - 如何找到由 3 个点和 3 个红外 LED 组成的三角形的旋转和平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12916645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com