【问题标题】:Find the center of a cube using rvec and tvec from aruco::estimatePoseSingleMarkers()使用来自 aruco::estimatePoseSingleMarkers() 的 rvec 和 tvec 找到立方体的中心
【发布时间】:2018-01-09 06:40:08
【问题描述】:

我有一个带有 6 个 aruco 标记的立方体,并试图在世界坐标中找到立方体的中心。基本上需要将 aruco 标记中心的已知点向下移动到垂直于标记面的立方体长度的一半。

在汽车游戏中,这类似于根据其速度和前进方向找到下一个位置。

我不确定如何在 rvec 的相反方向上将点转换给定距离。我在世界坐标中的 3D 位置之后,所以这个没有太大帮助。

这是我目前基于projectPoints() implementation的内容

                Matx33d R;
                Rodrigues(rvecs[i], R);
                Affine3d aff(rvecs[i], tvecs[i]);
                Vec3d move_along_z(0, 0, 0.5f);
                Vec3d new_point = aff*move_along_z; // ??

【问题讨论】:

  • 您的链接指向 OpenCV 中的鱼眼模块...不确定您是否是这个意思。据我了解,您应该执行以下操作:找到 aruco 标记,获取 3D 姿势,然后垂直于标记移动(取决于您的坐标系)并获得中心...看看this tutorial据我在教程中看到的,你必须移动 -0.5。它是move_along_z * aff,因为您向标记的中心移动,然后对其应用额外的移位。尝试并绘制它:)

标签: c++ opencv


【解决方案1】:

这个答案主要基于this post

                double half_side = 0.05;
                cv::Mat rot_mat;
                Rodrigues(rvecs[i], rot_mat);

                 // transpose of rot_mat for easy columns extraction
                 Mat rot_mat_t = rot_mat.t();
                 // transform along z axis
                 double * rz = rot_mat_t.ptr<double>(2); // x=0, y=1, z=2
                 tvecs[i][0] +=  rz[0]*half_side;
                 tvecs[i][1] +=  rz[1]*half_side;
                 tvecs[i][2] +=  rz[2]*half_side;

                aruco::drawAxis(imageCopy, camMatrix, distCoeffs, rvecs[i], tvecs[i],
                                markerLength * 0.5f);

上面的代码通过将 aruco 轴在 z 轴上的距离转换为 half_side 的距离,使 aruco 轴浮动在标记上方。

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多