2017-05-26 48 views
0

ベクトルをcv :: Matに変換しようとしていますが、これは2次元行列の各要素が3次元の行列(640 * 480) CV_32FC3(それぞれx、y、zを表す3つのチャネル)。<cv::Point3f>をCV_32FC3型のcv :: Matに変換する

n_rows = 480 and n_cols=640 

xyzMap = cv::Mat(xyzBuffer).reshape(3, 480);はまた、アクセス違反の例外 enter image description here

vector<cv::Point3f> xyzBuffer; 

で終わり、なぜ私は再形成のための他の方法を使用する場合、わからない:

cv::Mat xyzBuffMat = cv::Mat(xyzBuffer.size(), 1, CV_32FC3); 
    for (int i = 0; i < xyzBuffer.size(); i++) { 
     xyzBuffMat.at<float>(i, 0, 0) = xyzBuffer[i].x; 
     xyzBuffMat.at<float>(i, 0, 1) = xyzBuffer[i].y; 
     xyzBuffMat.at<float>(i, 0, 2) = xyzBuffer[i].z; 
    } 

    xyzMap = xyzBuffMat.reshape(3, 480); 

を、それも提供します次の行を指すアクセス違反: enter image description here

答えて

0

次は私のために働いているが、色がとても奇妙です:trueフラグへ

xyzMap = cv::Mat(xyzBuffer, true).reshape(3, 480); 

ご注意ください。

+2

色が奇妙なのは、通常、チャネルの順序が間違っていることを意味します。あなたのベクトルの順序は何ですか? RGBRGBRGB ..? OpenCVはBGRの順序付けを使用するので、後で 'cvtColor(xyzMap、xyzMap、CV_RGB2BGR);'が必要になるかもしれません。さらなる提案のためにサンプル画像をアップロードしてください。 – Micka

3

私はあなたが間違って行列を埋めると思います。サイズを変更する必要はありません。あなたがDepthCamera.cpp、のメソッドremoveNoise()を見てみると(x、y、z)の値は、次の規則を使用して割り当てられている座標:

xyzMap.at<cv::Vec3f>(y, x)[0] = [x value]; 
xyzMap.at<cv::Vec3f>(y, x)[1] = [y value]; 
xyzMap.at<cv::Vec3f>(y, x)[2] = [z value]; 

問題を解決します希望。

関連する問題