使用 rvec 和 tvec 从 aruco::estimatePoseSingleMarkers() 查找立方体的中心

Find the center of a cube using rvec and tvec from aruco::estimatePoseSingleMarkers()

本文关键字:查找 立方体 estimatePoseSingleMarkers rvec tvec aruco 使用      更新时间:2023-10-16

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

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

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

这就是我到目前为止基于projectPoints((实现的内容

                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; // ??

这个答案主要基于这篇文章。

                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);

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