需要帮助使用开放CV c。将物体的姿态估计++

问题描述 投票:0回答:2

我有从校准的相机的固有和失真矩阵。我使用开放CV 3.2 C ++。我收到错误输出的姿势对象的估计。帮我理清这个错误。值和误差图像在下面附接。

Mat K = (Mat_<double>(3, 3) << 5489.58773029126, 0, 1167.86282865392, 0, 5481.84660546223, 1047.21450461614, 0, 0, 1);
Mat dist = (Mat_<double>(1, 5) << -0.111931171641671, 0.087488429523756156, 0.000844290429230941, 0.00204127293599477,0);  

我已经有图像和物体分,因此与solvepnp继续用于获取旋转和平移vector.So,

Mat rvecs, tvecs;
vector<Point3f> end_point3D;
vector<Point2f> end_point2D;
end_point3D.push_back(Point3f(50, 0, 0));
end_point3D.push_back(Point3f(0, 50, 0));
end_point3D.push_back(Point3f(0, 0, 50));

solvePnP(Object_points, Image_points, K, dist, rvecs, tvecs);
projectPoints(end_point3D, rvecs, tvecs, K, dist, end_point2D, noArray(), 0.0);

    cv::line(image, Image_points[0], end_point2D[0], cv::Scalar(255, 0, 0), 6);
    cv::line(image, Image_points[0], end_point2D[1], cv::Scalar(0, 255, 0), 6);
    cv::line(image, Image_points[0], end_point2D[2], cv::Scalar(0, 0, 255), 6);

图像给出below.error output of estimated pose

编辑:物点和像点以同样的方式正确排序。我可以肯定的排序,我也做了行优先排序。

Size sq_size(6, 6);
int  Sq_length = 30;
vector<Point3f>Object_points;

for (int r = 0; r < sq_size.height; r++)
    for (int c = 0; c < sq_size.width; c++)
        Object_points.push_back(Point3f(r*Sq_length, c*Sq_length, 0));

vector<Point2f>Image_points;
for (int i = 0; i < 36; i++)
    Image_points.push_back((Point2f)op_cent[i]);
//row-major ordered image points

我有两个疑问,1.Though它们正常有序的,有时造成结果错误,如下图所示,这可能是什么原因?

Error pose output

2.如果我画,估计Image_points仅造成[0],它出来是正确的,但不能以任何其它点。有人可以解释为什么姿势是错误的Image_points [30]?在任何一点的物体会应该是一样吧?

opencv pose-estimation extrinsic-parameters
2个回答
0
投票

solvePnP(文档是OpenCV的4.0.1,请访问https://docs.opencv.org/根据您的OpenCV版本浏览正确的文档),需要至少4个点来计算相机姿态。

您正在使用的OpenCV 3.2,但断言已经被添加在以后的OpenCV版本。


0
投票

我目前正在对姿态估计编写软件。但你的问题的描述是不是真的我清楚。也许你可以让你的情况更多更新的观点。

这里是我的意见可能会有所帮助:

我用rvecs和tvecs初始旋转和平移,I输入那些初始位置垫对象,我需要3初始旋转和3的初始位置。该solvePnP将它作为初始起点进一步的计算。它给了我相当准确的结果。

为您的代码,你给的信息太少,我做对了事情的原委前/这些代码之后的注释。

© www.soinside.com 2019 - 2024. All rights reserved.