我有从校准的相机的固有和失真矩阵。我使用开放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它们正常有序的,有时造成结果错误,如下图所示,这可能是什么原因?
2.如果我画,估计Image_points仅造成[0],它出来是正确的,但不能以任何其它点。有人可以解释为什么姿势是错误的Image_points [30]?在任何一点的物体会应该是一样吧?
solvePnP
(文档是OpenCV的4.0.1,请访问https://docs.opencv.org/根据您的OpenCV版本浏览正确的文档),需要至少4个点来计算相机姿态。
您正在使用的OpenCV 3.2,但断言已经被添加在以后的OpenCV版本。
我目前正在对姿态估计编写软件。但你的问题的描述是不是真的我清楚。也许你可以让你的情况更多更新的观点。
这里是我的意见可能会有所帮助:
我用rvecs和tvecs初始旋转和平移,I输入那些初始位置垫对象,我需要3初始旋转和3的初始位置。该solvePnP将它作为初始起点进一步的计算。它给了我相当准确的结果。
为您的代码,你给的信息太少,我做对了事情的原委前/这些代码之后的注释。