使用OpenCV中的指针检索深度

Retrieving depth by using pointer in OpenCV

本文关键字:检索 深度 指针 OpenCV 使用      更新时间:2023-10-16

下面的代码可以很好地检索第240行和第320列的深度值。

    capture.retrieve( rawdepth, CV_CAP_OPENNI_DEPTH_MAP); // Mat rawdepth(Size(640,480), CV_16UC1);
    cout << "rows: " << rawdepth.rows << " cols: " << rawdepth.cols << endl;
    cout << "depth is " << rawdepth.at<unsigned short>(rawdepth.rows/2,rawdepth.cols/2) << endl;

如果我站在Kinect前面1米处,它的值大约为900-1100。但当我添加以下代码时,我站在kinect相机前,两者都会产生不同的结果。

        uint16_t* depthdata = (uint16_t*)rawdepth.data;
        cout << "depthdata is " << depthdata[76800] << endl;

depthdata[76800]总是产生0,即使我移动kinect以面向另一个方向。

如果我使用以下代码,并将Kinect对着一堵平墙,(rawdepth.rows/2,rawdepth.cols/2)会得到与depthdata[78600]相同的结果。

        uint16_t* depthdata = (uint16_t*)rawdepth.data;
        cout << "depthdata is " << depthdata[78600] << endl;

我的问题是,如果76800的depthdata不等于(rawdepth.rows/2,rawdepth.cols/2),我想知道,是什么?我从240*320中获得了76800。

如果矩阵是行对齐的,那么访问位置(x,y)的元素的方法是使用以下方法:

    matrix[y*elements_per_row + x]

OpenCV中的矩阵被设计为32位对齐,因此每行的末尾通常都有一些填充。CvMat有一个字段size_t step,它以字节为单位告诉每行的宽度。

试试这个,看看它是否给出了你期望的结果:

    uint8_t* depthdata = (uint8_t*)rawdepth.data;
    uint16_t middle_element = *(uint16_t *)(depthdata + rawdepth.step*240 + sizeof(uint16_t)*320);
    cout << "depthdata is " << middle_element << endl;

参考:OpenCV';简历:Mat&CvMat行对齐

来自opencv参考手册:

在二维阵列的情况下,上述公式简化为:

addr(Mi,j) = M.data + M.step[0] ∗ i + M.step[1] ∗ j

注意,M.step[i]>=M.step[i+1](事实上,M.step[i]>=M.step[i+1]*M.size[i+1])。