2013-06-04 70 views
1

我試圖執行solvePnP找到相機的外部參數。我使用已知的3D位置檢測圖像上的某些點,並將兩組點指向solvePnPSolvePnP工作不穩定和崩潰

隨着一些點函數的工作非常準確,但很多時,當我添加或刪除一些點的設置解決方案變得完全不正確。實際上,需要花費很多努力才能找到對於solvePnP有利的一組點。

檢測到的點不是很準確(+ - 10像素距離真實位置) - 它可能是一個原因嗎?但仍然有一些它完美的作品。

而另一個問題是SolvePnPRansacSolvePnPCV_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 

非常感謝你。

+0

我發現了什麼是СV_P3P標誌的問題。這是因爲我在那裏通過了太多點(正好需要4)。此外,對於我的情況,solvePnP的CV_EPNP標誌比其他標誌更穩定,但仍然沒有那麼多。 Ransac函數應該沒有這個問題,但我不能運行它。它仍然崩潰。 –

+0

我對solvePnPRansac的解決方案是使用Mat而不是向量。雖然在文檔中說這兩個版本都是可能的,但在我的案例中,Mat工作正常,Vector會拋出異常。我嘗試了雙重和浮動。如預期的那樣,Ransac對於異常值是最穩定的。 –

回答

0

我發現СV_P3P標誌有什麼問題。這是因爲我在那裏通過了太多點(正好需要4)。