2014-02-25 56 views
1

我在OpenCV中遇到了問題。從kinect接收到一個深度框架後,我試圖用frame.getData()返回的數據填充Matrix(Mat OpenCV)。如何在OpenCV中使用depthPixel數組填充OpenNi的矩陣

問題是depthMat矩陣中的數據與p1數組中包含的數據不同(來自frame.getData())。

有沒有人知道爲什麼這個,或者我如何填補我的矩陣來獲得正確的結果。

DepthPixel* p1 = (DepthPixel*)frame.getData(); 
Mat depthMat = Mat(frame.getHeight(), frame.getWidth(), CV_16U, p1); 

回答

1

我用我的一個簡單的程序測試了這段代碼,它完美地工作。 但請記住,您正在進行演員表演。函數getData()返回一個const void *,表示您正在將其轉換爲非常量指針。 這不是一個好習慣。 在文檔中,如果由getData()返回的指針指向的數據具有無限的使用期限,則不清楚。

一個更好的辦法來做到這一點是將數據複製到緩衝區中,然後使用該緩衝區來初始化cv::Mat

depth.readFrame(&depthFrame); 
    DepthPixel *depthPixels = new DepthPixel[depthFrame.getHeight()*depthFrame.getWidth()]; 
    memcpy(depthPixels, depthFrame.getData(), depthFrame.getHeight()*depthFrame.getWidth()*sizeof(uint16_t)); 

    cv::Mat depthImage(depthFrame.getHeight(), depthFrame.getWidth(), CV_16U, depthPixels); 
+0

你怎麼能驗證數據在depthPixels和depthImage是平等的? 我試圖將它寫入一個文件(和鑄造),但它正在打印不同的數據,也許在寫入過程中從16位轉換是問題。 輸出示例: depthPixels:2881,depthImage:182717178 ... – user1876275