以下代码段在检索行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;

如果我在1m处站在Kinect的前面,它的值大约为。 900-1100。但是,当我添加以下代码时,我站在kinect摄像机的前面,两者都会产生不同的结果。
        uint16_t* depthdata = (uint16_t*)rawdepth.data;
        cout << "depthdata is " << depthdata[76800] << endl;

即使我将kinect移向另一个方向,depthdata [76800]始终会产生0。

如果我使用以下代码,并将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's cv::Mat & CvMat row alignment

关于c++ - 在OpenCV中使用指针检索深度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12327746/

10-14 10:03