1
我試圖執行solvePnP
找到相機的外部參數。我使用已知的3D位置檢測圖像上的某些點,並將兩組點指向solvePnP
。SolvePnP工作不穩定和崩潰
隨着一些點函數的工作非常準確,但很多時,當我添加或刪除一些點的設置解決方案變得完全不正確。實際上,需要花費很多努力才能找到對於solvePnP
有利的一組點。
檢測到的點不是很準確(+ - 10
像素距離真實位置) - 它可能是一個原因嗎?但仍然有一些它完美的作品。
而另一個問題是SolvePnPRansac
和SolvePnP
與CV_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)。此外,對於我的情況,solvePnP的CV_EPNP標誌比其他標誌更穩定,但仍然沒有那麼多。 Ransac函數應該沒有這個問題,但我不能運行它。它仍然崩潰。 –
我對solvePnPRansac的解決方案是使用Mat而不是向量。雖然在文檔中說這兩個版本都是可能的,但在我的案例中,Mat工作正常,Vector會拋出異常。我嘗試了雙重和浮動。如預期的那樣,Ransac對於異常值是最穩定的。 –