2016-10-12 9 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されていないのはなぜ? マトリックスを印刷する2番目の方法が間違った結果をもたらすのはなぜですか? 何か助けていただければ幸いです。

+1

CV_32FC1は浮動小数点形式(ダブルではない)ではありませんか? – Thomas

+1

"32"は32ビットを意味すると思います。実際には「ダブル」ではなく「フロート」を意味します。 OpenCVはタイプセーフなライブラリではありません。 –

答えて

2

あなたはdoubleで作業しているので、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

働いてくれてありがとう。 –

関連する問題