使用OpenCV中的指针检索深度
Retrieving depth by using pointer in OpenCV
下面的代码可以很好地检索第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])。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 使用VerQueryValue检索应用程序的文件描述
- OpenGL在启用深度测试时不会丢弃我的碎片
- 是否可以从格式字符串中检索"width"
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- C++尝试深度复制唯一指针时出现内存访问冲突
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- 如何在Qt中从数据库中检索二进制数据?
- 试图找到二叉树的深度
- 如何从C++代码中检索 QML 的文本字段中的文本?
- 从 opencv c++ 中的矢量中检索固定的帧数
- 如何在不等待检索的情况下获取C++中的内存位置?
- 如何在 QTreeWidget 中检索特定项目的 mimeData?
- C++从字符串中检索几行
- 操纵安卓相机的深度图导致应用程序崩溃
- 深度值没有意义 R200 相机
- 在数据库中插入和检索矩阵
- 对如何制作双链表的深度副本感到困惑?
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 使用OpenCV中的指针检索深度