【问题标题】:How to fill a Matrix in OpenCV with depthPixel array of OpenNi如何用 OpenNi 的 depthPixel 数组填充 OpenCV 中的矩阵
【发布时间】:2014-02-25 18:18:48
【问题描述】:

我对 OpenCV 有疑问。从 kinect 接收到深度帧后,我尝试用 frame.getData() 返回的数据填充矩阵(OpenCV 的垫子)。

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

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

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

【问题讨论】:

    标签: c++ opencv kinect openni


    【解决方案1】:

    我用我的一个简单程序测试了这段代码,它运行良好。 但是请记住,您正在进行演员表。函数 getData() 返回一个 const void *,您将其转换为非 const 指针。 这不是一个好习惯。 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);
    

    【讨论】:

    • 如何验证depthPixels和depthImage中的数据是否相等?我正在尝试将其写入文件(和转换),但它正在打印不同的数据,也许在写入过程中从 16 位转换是问题所在。输出示例:depthPixels: 2881, depthImage: 182717178 ...
    猜你喜欢
    • 2013-06-07
    • 2019-06-15
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2012-03-06
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多