Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Kinect在OpenCV中获取深度值并转换为毫米?_Opencv_Kinect_Depth_Openni - Fatal编程技术网

如何使用Kinect在OpenCV中获取深度值并转换为毫米?

如何使用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的最大值差了很多 如何将这些值转换为毫米,以便使用它们?谢谢深度贴图数

我让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;