2016-10-12 3 views
0

나는 cv :: Mat로 놀고 있는데, 코드가 실제로 이상하다고 생각한다. 문법은 here에 기술되어있다.매트릭스가 제대로 초기화/인쇄되지 않는 이유는 무엇입니까?

코드 :

std::cout << "parameter for matrices: " << "x = " << X << " y = " << Y << " psi = " << Psi << std::endl; 
double dataRot[] = { cos(Psi), -sin(Psi), sin(Psi), cos(Psi) }; 
double dataTrans[] = { X, Y }; 
cv::Mat matRot(2, 2, CV_32FC1, dataRot); 
cv::Mat matTrans(2, 1, CV_32FC1, dataTrans); 
std::cout << "matRot = " << matRot.at<double>(0,0) << "," << matRot.at<double>(0,1) << ";" << matRot.at<double>(1,0) << "," << matRot.at<double>(1,1) << std::endl; 
std::cout << "matRot = " << matRot << std::endl; 
std::cout << "matTrans = " << matTrans.at<double>(0,0) << "," << matTrans.at<double>(0,1) << std::endl; 
std::cout << "matTrans = " << matTrans << std::endl; 
matOut = matRot*matIn + matTrans*cv::Mat::ones(1, matIn.cols, CV_32FC1); 

출력 :

parameter for matrices: x = 20.5 y = 20 psi = 0 
matRot = 1,-0;-0,0 
matRot = [0, 1.875; 
    0, -0] 
matTrans = 20.5,20 
matTrans = [0; 2.8203125] 

가 왜 행렬이 제대로 initalized되지 않는 이유는 무엇입니까? 왜 행렬을 인쇄하는 두 번째 방법이 잘못된 결과를 제공합니까? 도움을 주시면 감사하겠습니다. 당신이 double 작업하고 있기 때문에

+1

CV_32FC1은 부동 소수점 형식 (이중이 아님)이 아닙니까? – Thomas

+1

"32"는 32 비트를 의미합니다. 실제로는 '이중'이 아니라 '떠 다니는'것을 의미합니다. OpenCV는 매우 안전한 형식 라이브러리가 아닙니다. –

답변

2

의 OpenCV의 매트릭스 타입 CV_64FC1해야한다 : 편의상

cv::Mat matRot(2, 2, CV_64FC1, dataRot); 
cv::Mat matTrans(2, 1, CV_64FC1, dataTrans); 

, 당신은 또한 사용할 수 있습니다

cv::Matx22d matRot(cos(Psi), -sin(Psi), sin(Psi), cos(Psi)); 
cv::Matx21d matTrans(X, Y); 

나 :

cv::Mat1d matRot = (cv::Mat1d(2,2) << cos(Psi), -sin(Psi), sin(Psi), cos(Psi)); 
cv::Mat1d matTrans = (cv::Mat1d(2,1) << X, Y); 

과 같은 액세스 값 :

std::cout << matRot(row, col); 
+0

일해 줘서 고마워. –

관련 문제