如何链接两个 ArUco 标记的姿势?

Posted

技术标签:

【中文标题】如何链接两个 ArUco 标记的姿势?【英文标题】:How to link the pose of two ArUco markers? 【发布时间】:2019-02-06 18:48:42 【问题描述】:

我正在使用 OpenCV 和 ArUco 库开发姿势估计应用程序。 在我的场景中有两个标记,比如 A 和 B。 我知道 A 和 B 的位姿(tvecrvec),所以位姿是相对于相机的。

我想知道 B 相对于 A 的姿势。我知道 OpenCV 提供了cv::Rodrigues 并且我尝试使用它,但我认为我缺乏理论。这是我尝试过的:

        [...]

        cv::Rodrigues(rvecs[0], R1_rodriguez);
        cv::Rodrigues(rvecs[1], R2_rodriguez);

        cv::Mat R1 = R1_rodriguez;
        cv::Mat R2 = R2_rodriguez;

        cv::Mat M1 = (cv::Mat_<double>(4,4) <<
                   R1.at<double>(0,0),R1.at<double>(0,1),R1.at<double>(0,2),tvecs[0][0],R1.at<double>(1,0),R1.at<double>(1,1),R1.at<double>(1,2),tvecs[0][1],R1.at<double>(2,0),R1.at<double>(2,1),R1.at<double>(2,2),tvecs[0][2],0.0,0.0,0.0,1.0);

        cv::Mat M2 = (cv::Mat_<double>(4,4) <<
                      R2.at<double>(0,0),R2.at<double>(0,1),R2.at<double>(0,2),tvecs[1][0],R2.at<double>(1,0),R2.at<double>(1,1),R2.at<double>(1,2),tvecs[1][1],R2.at<double>(2,0),R2.at<double>(2,1),R2.at<double>(2,2),tvecs[1][2],0.0,0.0,0.0,1.0);
        cv::Mat M1_inv = M1.inv();

        cv::Mat M2inM1 = M1_inv*M2;

所以我的问题是:如何将 B“映射”到 A,那么我如何知道 B 相对于 A 的姿势(知道相机帧中的姿势)? 换句话说,我将 A 想象为 (0,0,0),我想知道 B 的姿势(所以平移和旋转)。提前谢谢。

【问题讨论】:

【参考方案1】:

如果您已经设置了世界坐标并且您知道 A 和 B 相对于您选择的世界坐标系的姿势 (rvec & tvec)。例如:您知道世界坐标系中 A 和 B 的 x,y,z 的所有 3 个旋转角度和平移向量。

那么,在我看来,你需要做的就是通过减/加(视情况而定)A和B的位姿来处理获得的位姿数据,以获得相对位姿。

【讨论】:

以上是关于如何链接两个 ArUco 标记的姿势?的主要内容,如果未能解决你的问题,请参考以下文章

ARCore Pose 和 Aruco 估计PoseSingleMarkers

如何从 3d 对象文件中获取 3d 坐标。

使用Python,OpenCV生成Aruco标记

Aruco Marker World Coordinates

带有openCv的Aruco标记,获取3d角坐标?

带有特定标记的 OpenCV 自定义 Aruco 字典?