如何使用OpenNi的depthPixel数组填充OpenCV中的Matrix

时间:2014-02-25 09:00:01

标签: c++ opencv kinect openni

我遇到OpenCV问题。从kinect收到深度帧后,我试图用frame.getData()返回的数据填充Matrix(Mat的OpenCV)。

问题是depthMat矩阵中的数据与p1数组中包含的数据不同(来自frame.getData())。

有谁知道为什么会这样,或者我如何填写我的矩阵以获得正确的结果。

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

1 个答案:

答案 0 :(得分: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);