1

我正在尝试实现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

非常感谢你。

4

1 回答 1

0

我发现 СV_P3P 标志有什么问题。这是因为我在那里通过了太多的分数(正好需要 4 分)。

于 2015-08-27T16:23:57.520 回答