2012-01-14 42 views
1

這是怎麼了應該做的,如果我嘗試簡單的代碼,它的工作原理:OpenCV的2.3席訪問單信道矩陣元素

Mat a= Mat(4,3, CV_32FC1); 
float elem_a= a.at<float>(i,j); 

但做一些數學後,該代碼給出撥錯結果

Mat intrinsics(3, 3, CV_32FC1); 
Mat distortion(5, 1, CV_32FC1); 
fs["camera_matrix"] >> intrinsics; //3*3 
fs["distortion_coefficients"] >> distortion; //5*1 

Mat rvec(1, 3, CV_32FC1); 
Mat tvec(1, 3, CV_32FC1); 
Mat R(3, 3, CV_32FC1); 
Mat A(3, 3, CV_32FC1); 

solvePnP(Mat(objectPoints), Mat(imagePoints), intrinsics, distortion, rvec, tvec, false); 

Rodrigues(rvec, R); 
A = intrinsics * R; 

cout << "A = " << A << endl; 
cout << "A[0] = " << A.at<float>(0,0) << "A[1] = " << A.at<float>(0,1) << endl; 

輸出:

A = 
[-123.6820813196553, 792.0751394843999, -359.9404307669494; 
    668.8426426360758, -15.08087511838299, -513.8498143647524; 
    -0.3389607187919322, -0.03644067597638417, -0.9400945209128925] 

A[0] = 4.12987e+09 A[1] = -3.48313 

我到底做錯了什麼? Ty

+0

什麼(*(float *)(A.data))打印出來? – Boaz 2012-01-14 14:09:40

+0

關於Rodrigues()之後的R數據類型的文檔是什麼? – Sam 2012-01-14 17:24:54

+0

@ Boaz.Jan cout <<((float)(A.data))<< endl;在編譯時發生錯誤「錯誤:從類型'uchar * {aka unsigned char *}'無效轉換爲鍵入'float'」... docs不說任何內容http://opencv.itseez.com/modules/calib3d/doc /camera_calibration_and_3d_reconstruction.html?highlight=extrinsic#void%20Rodrigues(InputArray%20src,%20OutputArray%20dst,%20OutputArray%20jacobian) – notphunny 2012-01-15 13:07:56

回答

1

請檢查矩陣的數據類型。我認爲它已悄悄轉換爲CV_64F

+0

你是對的,當我試圖輸出A.at (0,0)我得到了正確的結果。 solvePnP可能會默默地將它轉換爲CV_64F,這是你的全部 – notphunny 2012-01-15 13:18:10