1

以下代码在检索第 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 前面 1m 处,它的价值约为。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。

4

2 回答 2

2

如果矩阵是行对齐的,则访问位置 (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;

ref: OpenCV 的 cv::Mat & CvMat 行对齐

于 2012-09-08T03:51:14.233 回答
1

从 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] )。

于 2012-09-08T03:51:32.407 回答