我正在尝试实现solvePnP来查找相机的外部参数。我检测到图像上具有已知3d位置的一些点,并将2组点馈给solvePnP

使用一些点集功能可以非常准确地工作,但是当我从集合中添加或删除一些点时,解决方案变得完全不正确。实际上,要找到哪些点对solvePnP有利,需要花费很多精力。

检测到的点不是非常准确(+-真实位置的10像素)-这可能是原因吗?但是仍然可以通过某些设置完美地运行。

另一个问题是带有SolvePnPRansac参数的SolvePnPCV_P3P崩溃会引发内存异常。

这是我的代码

vector<cv::Point3d> points3d;
vector<cv::Point2d> points2d;
cv::Mat rvec(3,1,CV_64FC1,Scalar::all(0)) , tvec(3,1,CV_64FC1,Scalar::all(0));
Mat cam_matrix = Mat(3,3,CV_64FC1,Scalar::all(0));
cam_matrix.at<double>(0,0) = 395.;
cam_matrix.at<double>(0,2) = 160.;
cam_matrix.at<double>(1,1) = 395.;
cam_matrix.at<double>(1,2) = 120.;
cam_matrix.at<double>(2,2) = 1.0f;



 /*
here is a code for pushing 3d and 2d points to points3d and points2d vectors
*/

cv::solvePnP(points3d, points2d, cam_matrix, Mat(), rvec, tvec, false, CV_ITERATIVE); //very unstable
//cv::solvePnPRansac(points3d, points2d, cam_matrix, Mat(), rvec, tvec, false); // memory exception
//cv::solvePnP(points3d, points2d, cam_matrix, Mat(), rvec, tvec, false, CV_P3P); // memory exception

非常感谢你。

最佳答案

我发现СV_P3P标志有什么问题。这是因为我在那儿传递了太多的分数(恰好需要4分)。

关于opencv - SolvePnP工作不稳定并崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16911975/

10-12 04:55