如何找到由3点与3个红外LED组成的三角形的旋转和翻译
How to find rotation and translation of a triangle made of 3 points with 3 infrared leds
我正在从事一个项目,那里我只有1个静态摄像头(不移动),但在其上有3个点(它是平面平面,所以点的差异在z方向为零)。相机始终处于相同的位置,平面在空间中移动和旋转。我已经用25个棋盘图像校准相机和功能:
calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs);
,不合适的工作正常。现在,我将OpenCV(C )写入XML文件中。
我如何在新程序中使用这些参数,以找到形成三角形的3点(用红外LED制成),然后将我的旋转和翻译返回此三角形?
2D案例
答案的这一部分仅讨论平面中的刚性动议,因此它与问题不完全匹配。
假设您已经确定了自己的观点,这似乎是根据您的评论工作的。现在,您可以计算这些要点之间的距离并订购它们。两个检测到的点之间的最短距离应对应于原始三角形的最短边缘,依此类推。有了这些信息,您可以将点标记为 a , b 和 c 。
接下来,您移动(翻译)所有点,以便后来置于原点。这是假设您的原始三角形在原点上有一个角落。让我们假设 a 在原始三角形和移动的点集中。该向量的否定版本指示您的三角形的 translation 。
现在旋转。假设您的原始三角形, b 位于正 x 轴,即 y = 0和 x>>0。现在您可以从相机中占据 b 的(移动)位置,并使用其坐标的atan2
,您可以确定线路之间的角度 ab之间的角度和 x 轴。这就是三角形的 rotation 的角度。
您可以将这两种结合在一起以形成仿射转换。如果您的原始三角形在原点不带有 a ,而 b 在 x 轴的正部分上,则可以使用类似的技术确定您的原始三角形如何与具有所描述属性的三角形相关。
3D案例
对于太空中的僵化运动,我没有现成的解决方案。只是一个主意。假设您的相机位于原点,您分析的图像嵌入了 z = 1。图像中对应于该嵌入式位置的一个点(x , y>,1),并且穿过该点的射线由该坐标的倍数给出,即λx,λy,λ)。因此,从点的位置开始, a a b 和 c 在您的图像中,您可以根据一个单一计算太空中的相应点每个点可变,例如 a 通过 c 。
现在,您的任务是选择这三个变量,以使太空点之间的距离与三角形的边缘长度匹配。这导致了三个变量的三个方程组的系统:
(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坐标后,相比之下,应该简单地计算这些转换。这完全取决于您想要的旋转描述的格式。
- 与互斥锁相比,旋转锁可以保证上下文切换
- 绘制旋转的三角形
- 旋转模型矩阵时的形状失真
- 四边形的 2D 旋转
- 如何用for循环在c++中生成单词三角形
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 如何使用递归打印修改后的星号三角形图案
- 发布旋转矩阵(openGL/glm)
- C++ 创建带有 for 循环的三角形
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Eigen c++ 三角形来自
- 旋转三角形并在opengl中改变其颜色
- 如何找到由3点与3个红外LED组成的三角形的旋转和翻译
- 旋转三角形导致黑屏
- 在 OpenGL 中创建一个围绕其 y 轴连续旋转的三角形
- 程序(三角形旋转)异常终止
- 在DirectX中围绕质心旋转一个等边三角形
- 求两个全等三角形之间的旋转
- OpenGL 3.3 - 2个三角形的不同旋转