2012-01-14 43 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