Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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
Python';s libfreenect Kinect 1深度贴图数据格式_Python_Kinect_Openkinect - Fatal编程技术网

Python';s libfreenect Kinect 1深度贴图数据格式

Python';s libfreenect Kinect 1深度贴图数据格式,python,kinect,openkinect,Python,Kinect,Openkinect,对于一个项目,我一直在尝试将libfreenect给出的深度贴图(深度值为0-255的480 x 640矩阵)转换为更有用的(x、y、z)坐标 我最初假设每个像素处的深度变量d表示传感器和找到的点之间的欧几里德距离。通过将相机表示为一个点,将矩阵表示为一个虚拟图像平面,并按照从相机到平面上像素的向量的距离d,我重建了我认为是实际坐标的东西。(每个点位于穿过相应像素的光线投射的距离d)。如下图1所示,重建的房间地图(如上图所示)失真 图1:d是欧几里德距离 如果我假设d表示相机到每个点的前向距离

对于一个项目,我一直在尝试将libfreenect给出的深度贴图(深度值为0-255的480 x 640矩阵)转换为更有用的(x、y、z)坐标

我最初假设每个像素处的深度变量
d
表示传感器和找到的点之间的欧几里德距离。通过将相机表示为一个点,将矩阵表示为一个虚拟图像平面,并按照从相机到平面上像素的向量的距离
d
,我重建了我认为是实际坐标的东西。(每个点位于穿过相应像素的光线投射的距离
d
)。如下图1所示,重建的房间地图(如上图所示)失真

图1:
d
是欧几里德距离

如果我假设
d
表示相机到每个点的前向距离,结果如下图所示,如图2所示。请注意三角形,因为测量点位于从机器人位置投影的光线上。当然,x和y坐标是根据深度缩放的,z是深度值
d

图2:
d
是距离相机的深度,或z坐标

作为参考,这里是如果我不按深度缩放x和y坐标而生成的地图,假设
d
是z坐标,并绘制(x,y,z)。请注意房间地图的矩形,因为不假定点位于传感器投射的光线上

图3:原始图像

根据以上图像,图2或图3可能是正确的。有人知道预处理libfreenect对捕获的数据点做了什么吗?我在网上查过,但没有找到关于深度在存储到这个矩阵之前是如何预处理的文档。感谢您事先提供的帮助,我很乐意提供所需的任何其他信息。

所有libfreenect都会生成值,其中每个
d
表示与摄像机的距离。有两种特殊格式,其中包括一些有用的预处理

  • FREENECT\u DEPTH\u MM
    产生以毫米为单位的距离
  • FREENECT\u DEPTH\u REGISTERED
    产生的距离以毫米为单位,其中深度的
    (x,y)
    与视频的
    (x,y)
    匹配
结果可以是世界坐标,但在不同的硬件模型中可能不完全准确。一种更可靠的方法是使用辅助对象暴露的via

给定一个
depth
数组,我们可以将其转换为点云

int i = 0;
std::vector<cv::Point3d> points(mode.width * mode.height);
for (int y = 0; y < mode.height; y++) {
  for (int x = 0; x < mode.width; x++) {
    double wx, wy;
    double z = depth[i];
    freenect_camera_to_world(x, y, z, &wx, &wy);
    points[i] = cv::Point3d(wx, wy, z);
    i++;
  }
}
inti=0;
标准::矢量点(模式宽度*模式高度);
对于(int y=0;y
这将产生与图2类似的结果。要从Python调用该函数,需要通过

int i = 0;
std::vector<cv::Point3d> points(mode.width * mode.height);
for (int y = 0; y < mode.height; y++) {
  for (int x = 0; x < mode.width; x++) {
    double wx, wy;
    double z = depth[i];
    freenect_camera_to_world(x, y, z, &wx, &wy);
    points[i] = cv::Point3d(wx, wy, z);
    i++;
  }
}