1

我使用以下 OpenCV 代码来估计方形标记的位姿并在图像上绘制标记的 3 个轴。但是标记的 Z 轴会不时旋转 180 度,如下图所示。如何使z轴稳定?

// Marker world coordinates
vector<Point3f> objecPoints;
objecPoints.push_back(Point3f(0, 0, 0));
objecPoints.push_back(Point3f(0, 2.4, 0));
objecPoints.push_back(Point3f(2.4, 2.4, 0));
objecPoints.push_back(Point3f(2.4, 0.0, 0));

// 2D image coordinates of 4 marker corners. They are arranged in the same order for each frame
vector<Point2f> marker2DPoints;

// Calculate Rotation and Translation
cv::Mat Rvec;
cv::Mat_<float> Tvec;
cv::Mat raux, taux;
cv::solvePnP(objecPoints, marker2DPoints, camMatrix, distCoeff, raux, taux);

// Draw marker pose on the image
vector<Point3f> axisPoints3D;
axisPoints3D.push_back(Point3f(0, 0, 0));
axisPoints3D.push_back(Point3f(2.4, 0, 0));
axisPoints3D.push_back(Point3f(0, 2.4, 0));
axisPoints3D.push_back(Point3f(0, 0, 2.4));

vector<Point2f> axisPoints2D;

// Take the camMatrix and distCoeff from camera calibration results
projectPoints(axisPoints3D, Rvec, Tvec, camMatrix, distCoeff, axisPoints2D);

line(srcImg, axisPoints2D[0], axisPoints2D[1], CV_RGB(0, 0, 255), 1, CV_AA);
line(srcImg, axisPoints2D[0], axisPoints2D[2], CV_RGB(0, 255, 0), 1, CV_AA);
line(srcImg, axisPoints2D[0], axisPoints2D[3], CV_RGB(255, 0, 0), 1, CV_AA);

在时间 t 的姿态估计结果 在时间 t+1 的姿态估计结果

4

1 回答 1

0

作为评论,这可能会更好,但我没有足够的声誉。我认为这可能是由于 solvePnP 获取标签坐标的顺序。此外,由于 solvePnP 只是试图将 3D 平面上的 4 个点与图像中的 4 个 2D 点进行匹配(在这种情况下),因此有多种解决方案。标签可以围绕其上轴旋转,也可以上下翻转。solvePnP 不知道从提供的点是向上的方向。

我有一种预感,对于这个问题,solvePnP 有点太笼统了,因为稳定的标签检测算法应该能够以稳定的顺序将角提供给姿势估计代码。

编辑:角的顺序很重要,solvePnP 给出的解决方案取决于它。也许生成角点的算法没有以一致的顺序提供角点?请分享 tags.points 的输出

于 2016-12-13T06:45:56.410 回答