使用Freenect和Python从Kinect获取点云
我有一个XBox 360 Kinect传感器通过Linux Mint连接。我正在尝试创建一个CSV文件,其中Z值表示距离传感器的距离。简而言之,我想使用Kinect作为一个短距离3D扫描仪。下面的代码生成了一个CSV文件,但这些值非常奇怪,似乎并不代表现实世界中的XYZ值。下面是生成的CSV文件的示例,所有行都具有类似的值。 x、 y,z -0.22424937966362582,0.16117004627017431,-0.39249255932230664 -0.22424937966362582,0.16050597521014062,-0.39249255932230664 -0.22424937966362582,0.15984190415010693,-0.39249255932230664 这些数字是什么意思?如何获得以米或厘米为单位的Z值?我哪里做错了 下面是我正在运行的代码的一个示例,它是从这个Github页面收集的 这是我的Python代码使用Freenect和Python从Kinect获取点云,python,xbox360,openkinect,Python,Xbox360,Openkinect,我有一个XBox 360 Kinect传感器通过Linux Mint连接。我正在尝试创建一个CSV文件,其中Z值表示距离传感器的距离。简而言之,我想使用Kinect作为一个短距离3D扫描仪。下面的代码生成了一个CSV文件,但这些值非常奇怪,似乎并不代表现实世界中的XYZ值。下面是生成的CSV文件的示例,所有行都具有类似的值。 x、 y,z -0.22424937966362582,0.16117004627017431,-0.39249255932230664 -0.22424937966362
#!/usr/bin/python
import sys, traceback
import freenect
import cv2
import numpy as np
import csv
print "running"
def get_depth():
array,_ = freenect.sync_get_depth()
array = array.astype(np.uint8)
return array
def depth2xyzuv(depth, u=None, v=None):
if u is None or v is None:
u,v = np.mgrid[:480,:640]
# Build a 3xN matrix of the d,u,v data
C = np.vstack((u.flatten(), v.flatten(), depth.flatten(), 0*u.flatten()+1))
# Project the duv matrix into xyz using xyz_matrix()
X,Y,Z,W = np.dot(xyz_matrix(),C)
X,Y,Z = X/W, Y/W, Z/W
xyz = np.vstack((X,Y,Z)).transpose()
xyz = xyz[Z<0,:]
# Project the duv matrix into U,V rgb coordinates using rgb_matrix() and xyz_matrix()
U,V,_,W = np.dot(np.dot(uv_matrix(), xyz_matrix()),C)
U,V = U/W, V/W
uv = np.vstack((U,V)).transpose()
uv = uv[Z<0,:]
return xyz
def uv_matrix():
"""Returns a matrix you can use to project XYZ coordinates (in meters) into
U,V coordinates in the kinect RGB image"""
rot = np.array([[ 9.99846e-01, -1.26353e-03, 1.74872e-02],
[-1.4779096e-03, -9.999238e-01, 1.225138e-02],
[1.747042e-02, -1.227534e-02, -9.99772e-01]])
trans = np.array([[1.9985e-02, -7.44237e-04,-1.0916736e-02]])
m = np.hstack((rot, -trans.transpose()))
m = np.vstack((m, np.array([[0,0,0,1]])))
KK = np.array([[529.2, 0, 329, 0],
[0, 525.6, 267.5, 0],
[0, 0, 0, 1],
[0, 0, 1, 0]])
m = np.dot(KK, (m))
return m
def xyz_matrix():
fx = 594.21
fy = 591.04
a = -0.0030711
b = 3.3309495
cx = 339.5
cy = 242.7
mat = np.array([[1/fx, 0, 0, -cx/fx],
[0, -1/fy, 0, cy/fy],
[0, 0, 0, -1],
[0, 0, a, b]])
return mat
depth = get_depth()
depthpoints = depth2xyzuv(depth)
print "Create csv header..."
f = open("/home/gerry/depthtest.csv",'a')
f.write("x,y,z\n")
f.close()
print "writing to text file...please wait...."
with open("/home/gerry/depthtest.csv", 'a') as f:
csvwriter = csv.writer(f)
csvwriter.writerows(depthpoints)
print "finished writing to text file..."
print "done"
#/usr/bin/python
导入系统,回溯
导入免费链接
进口cv2
将numpy作为np导入
导入csv
打印“运行”
def get_depth():
数组,\uu=freenect.sync\u get\u depth()
array=array.astype(np.uint8)
返回数组
def深度2xYZUV(深度,u=无,v=无):
如果u为无或v为无:
u、 v=np.mgrid[:480,:640]
#建立一个3×N的d、u、v数据矩阵
C=np.vstack((u.flatte(),v.flatte(),depth.flatte(),0*u.flatte()+1))
#使用xyz_矩阵()将duv矩阵投影到xyz中
十、 Y,Z,W=np.dot(xyz_矩阵(),C)
十、 Y,Z=X/W,Y/W,Z/W
xyz=np.vstack((X,Y,Z)).transpose()
xyz=xyz[Z读一下:
和libfreenect文档
有可用的校准信息z基本上是从第一个链接示例中的示例计算出的与相机的距离
smaple python代码来计算距离
def深度计(x):
请阅读以下内容:
和libfreenect文档
有可用的校准信息z基本上是从第一个链接示例中的示例计算出的与相机的距离
smaple python代码来计算距离
def深度计(x):
ans = (x>>3)/1000 #from stackover flow and libfreekinect imaging documentation
return ans