2015-02-23 259 views
0

我想使用cv :: solvePnPRansac找到給定3D到2D對應關係的對象姿態。我的通信可能有異常,所以我不想使用cv :: solvePnP。我已經使用了從opengl中的相機拍攝的快照的3D到2D對應關係。所以在反投影之後,我發現使用solvePnP後返回的旋轉矩陣是正確的。但是,當我使用solvePnPRansac時,我得到了一個單位矩陣和零平移向量。請幫忙!我已經使用了下面的代碼。提前致謝 !cv :: solvePnPRansac返回單位矩陣

// Parameters to solvePnP 
Mat camera_mat(3, 3, CV_64FC1); 
Mat distCoeffs(4, 1, CV_64FC1); 
Mat rvec(3, 1, CV_64FC1); 
Mat tvec(3, 1, CV_64FC1); 
Mat d(3, 3, CV_64FC1); 

vector<Point3f> list_points3d_model_match; 
vector<Point2f> list_points2d_scene_match; 

while(map >> u >> v >> x >> y >> z) 
{ 
    Point2f ip = Point2f(u, v); 
    Point3f sp = Point3f(x, y, z); 

    // cout << x << " " << y << " " << z << endl; 
    list_points3d_model_match.push_back(sp); 
    list_points2d_scene_match.push_back(ip); 
} 

camera_mat.at<double>(0, 0) = 600; 
camera_mat.at<double>(1, 1) = 600; 
camera_mat.at<double>(0, 2) = WIDTH/2; 
camera_mat.at<double>(1, 0) = HEIGHT/2; 
camera_mat.at<double>(3, 3) = 1; 

// solvePnP(list_points3d_model_match, list_points2d_scene_match, camera_mat, distCoeffs, rvec, tvec, 
    //     useExtrinsicGuess, CV_ITERATIVE); 

tvec.at<float>(0) = 0; 
tvec.at<float>(1) = 0; 
tvec.at<float>(2) = 2; 

d.at<float>(0, 0) = 1; 
d.at<float>(1, 2) = -1; 
d.at<float>(2, 1) = 1; 

Rodrigues(d, rvec); 

solvePnPRansac(list_points3d_model_match, list_points2d_scene_match, camera_mat, distCoeffs, rvec, tvec, false, CV_ITERATIVE); 

Rodrigues(rvec, d); 

double* _r = d.ptr<double>(); 
printf("rotation mat: \n %.3f %.3f %.3f\n%.3f %.3f %.3f\n%.3f %.3f %.3f\n", 
    _r[0],_r[1],_r[2],_r[3],_r[4],_r[5],_r[6],_r[7],_r[8]); 
} 

cout << "translation vec:\n" << tvec << endl; 

運行代碼後我得到以下輸出。

rotation mat: 
1.000 0.000 0.000 
0.000 1.000 0.000 
0.000 0.000 1.000 

translation vec: 
[0; 0; 0] 

回答

3

您的相機矩陣有誤。 您的代碼應閱讀:

camera_mat.at<double>(0, 0) = 600; 
camera_mat.at<double>(1, 1) = 600; 
camera_mat.at<double>(0, 2) = WIDTH/2; 
camera_mat.at<double>(1, 2) = HEIGHT/2; 
camera_mat.at<double>(3, 3) = 1; 
2

我以前有同樣的問題,這不是對攝像頭矩陣的錯誤類型。
變化

Mat camera_mat(3, 3, CV_64FC1); 
Mat distCoeffs(4, 1, CV_64FC1); 

的聲明CV_32FC1 ,不給的初始大小Mat tvecMat d