opencv - 使用单相机进行标记位姿估计的错误

标签 opencv camera geometry markers pose-estimation

我使用以下 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);

Pose estimation results at time t Pose estimation results at time t+1

最佳答案

这可能作为评论会更好,但我没有足够的声誉。我认为这可能是由于 solvePnP 获取标签坐标的顺序所致。 此外,由于 solvePnP 只是试图匹配(在本例中)3D 平面上的 4 个点与图像中的 4 个 2D 点,因此有多种解决方案。标签可以绕其上轴旋转,也可以倒置。 solvePnP 无法根据提供的点知道哪个是朝上的方向。

我有一种预感,solvePnP 对于这个问题来说有点过于笼统,因为稳定的标签检测算法应该能够以稳定的顺序将角输入到姿势估计代码中。

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

关于opencv - 使用单相机进行标记位姿估计的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41100909/

相关文章:

c - 我想在 OpenCV 中将图像转换为铅笔素描

python - 用opencv python删除背景

iPhone 4s : Restoring physical camera button functionality

algorithm - 找到某物和一条线之间的交点

c++ - 在 cpp、OpenCV 中使用 "Select file"对话框创建 GUI

c++ - 将几个 ROI 发送到另一个方法/函数来计算直方图?

3d - 将相机与矩形对齐

Android - cam.setPreviewDisplay(holder) 遇到 IOError

algorithm - 如何确定一个点是否位于 3D 三角形上

python - 如何有效地确定一组点是否包含两个接近的点