2017-05-26 168 views
0

我試圖向量轉換爲CV ::墊,其中它是2D矩陣(640 * 480)具有3個通道的2D矩陣的每個元素的類型CV_32FC3(三個信道的每個分別指的x,y和z)。轉換矢量<cv::Point3f>到CV ::類型CV_32FC3的墊

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

以下是爲我工作,但顏色是如此怪異:

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

,請注意true標誌。

+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]; 

希望能解決問題。

相關問題