如何使用Kinect在OpenCV中获取深度值并转换为毫米?
我让VS2010运行OpenCV 3.2.1和kniect 我正在使用来自的教程 (Kinect面朝墙壁,一米多远) 我听说这些值实际上是两个像素?我真的不明白 以下是我到目前为止的理解: 我抓起一个深度帧并将其存储在一个名为depthMap的矩阵中。矩阵的大小现在是640*480。我使用代码depthMap.at(0,0)从第0行第0列获取第一个深度值。但是没有得到毫米的结果,我得到了83690629!这比我期望的10000的最大值差了很多如何使用Kinect在OpenCV中获取深度值并转换为毫米?,opencv,kinect,depth,openni,Opencv,Kinect,Depth,Openni,我让VS2010运行OpenCV 3.2.1和kniect 我正在使用来自的教程 (Kinect面朝墙壁,一米多远) 我听说这些值实际上是两个像素?我真的不明白 以下是我到目前为止的理解: 我抓起一个深度帧并将其存储在一个名为depthMap的矩阵中。矩阵的大小现在是640*480。我使用代码depthMap.at(0,0)从第0行第0列获取第一个深度值。但是没有得到毫米的结果,我得到了83690629!这比我期望的10000的最大值差了很多 如何将这些值转换为毫米,以便使用它们?谢谢深度贴图数
如何将这些值转换为毫米,以便使用它们?谢谢深度贴图数据为单通道无符号16位。
尝试将
int
替换为CV\u 16UC1
我目前正在使用kinect(+OpenNi+OpenCv),我不知道您是否仍在处理您的问题
我尝试了完全相同的代码,但使用了depthMap.at(I,j)
,效果非常好,给出了以mm为单位的值(当我距离kinect 50 cm时为502)
问题是:我不知道深度价值是如何传递的,我在互联网上看到了很多相互矛盾的信息。为什么是2像素?为什么要转换成十六进制
我相信我不是一个在理解这些基本原则上苦苦挣扎的人。那么,有人有关于kinect深度的可靠文档吗
(我读到了stephane Magnenat/Nicolas Burrus公式:11位的kinect原始数据,添加了一些几何元素等等……但OpenNi是否已经处理了这些问题并提供了现有的深度??)
请随意评论。
干杯。检查正确的数据类型、调试模式,然后检查具有矩阵的断点,然后检查文件数据类型。深度值存储在11位中,封装在16位变量中。 因此,在访问矩阵时,必须提供正确的元素数据类型。 正如前面所回答的,您可以使用
depthMap.at(i,j)
,但您必须确保unsigned short
在所有编译器中都是16位长的。
我更喜欢使用uint16\t
数据类型
此外,根据您选择的openni PIXEL_格式,存储在矩阵中的深度值可以是:
- 以毫秒为单位-openni::像素\格式\深度\ 1毫米
- 以十分之一毫秒为单位-openni::像素格式深度100μm
void openni::VideoMode::setPixelFormat(PixelFormat)
功能设置像素格式
如果您想要更精确的数据(PIXEL\u FORMAT\u DEPTH\u 100\u UM
)以毫秒为单位,可以将其转换为float并除以10:
uint16_t redValue = depthMap.at<uint16_t>(i,j);
float myVal = ( (float) redValue ) / 10.0f;
uint16\u t redValue=depthMap.at(i,j);
float myVal=((float)redValue)/10.0f;
也许Kinect离墙壁太近,距离不足一米?我知道限制就在附近,如果不是那样的话。还可以看到na,它不在一米以下,因为我得到了相同的值,但当它离我们2-3米远的时候会稍微高一些。有人对我说,我需要将“depthMap.at(0,0)”更改为“depthMap.at(0,0)”,结果值是(83690629),实际上是两个像素,我应该转换为十六进制?(489102879=0x1d271e1f)不知道他在说什么。但我仍然得到相同的价值观,不知道如何最好地解释它们。
rows: 480 cols: 640
depth: 1157
rows: 480 cols: 640
depth: 1157
rows: 480 cols: 640
depth: 1157
rows: 480 cols: 640
depth: 1157
rows: 480 cols: 640
depth: 83690629
rows: 480 cols: 640
depth: 83690629
rows: 480 cols: 640
depth: 83690629
rows: 480 cols: 640
depth: 83690629
rows: 480 cols: 640
depth: 83690629
uint16_t redValue = depthMap.at<uint16_t>(i,j);
float myVal = ( (float) redValue ) / 10.0f;