2012-01-14 2 views
1

이것은 수행되는 방법이며, 내가 간단한 코드를하려고하면 그것은 작동 :OpenCV의 2.3 매트에 액세스하는 단일 채널 행렬 요소는

Mat a= Mat(4,3, CV_32FC1); 
float elem_a= a.at<float>(i,j); 
몇 가지 계산을 수행 한 후,이 코드는 worng 결과

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

+0

로드 리 게스 (Rodrigues()) 이후 R의 데이터 유형에 관한 문서는 무엇입니까? – Sam

+0

@ Boaz.Jan cout << ((float) (A.data)) << endl; 컴파일시 오류가 발생합니다. "오류 : 유형 'uchar * {aka unsigned char *}'에서 'float'을 입력 할 때 잘못된 형식으로 캐스팅되었습니다."... docs are nothing anything http://opencv.itseez.com/modules/calib3d/doc /camera_calibration_and_3d_reconstruction.html?highlight=extrinsic#void%20Rodrigues(InputArray%20src,%20OutputArray%20dst,%20OutputArray%20jacobian) – notphunny

답변

1

A 행렬의 데이터 유형을 확인하십시오. 나는 그것이 조용히 CV_64F으로 바뀌 었다고 생각한다.

+0

당신이 맞았습니다. 대답을 출력하려고했을 때 (0,0) 나는 올바른 결과를 얻었습니다. . 그 가능성은 solvePnP가 자동으로 CV_64F로 변환하는 것입니다. – notphunny