我回顾其他讨论,但对我来说并不清楚,我为我的无知而道歉,并提前感谢你。
我正在使用深度流和骨架关节的kinect。我想将Kinect提供的深度图像从2D投影到3D,以便在空间中构建曲面。
程序很简单,我得到了我的Kinect的内在参数(来自Daniel Herrera Toolkit)并制定了一个转换公式:
% Set 1000 to convert the raw depth value to meters.
zw = z_w / 1000;
xw = (xv - cx) * zw / fx;
yw = (yv - cy) * zw / fy;
具有深度相机焦距,来自Daniel Herrera的Kinect工具箱
fx = 579.83; % in axis x
fy = 586.73; % in axix y
cx = 321.55; % optical center x
cy = 235.01; % optical center y
zw = depth by kinect (mm)
且xv
和yv
对应于2D图像坐标,而xw
,yw
,zw
对应于以米为单位的对象坐标,其原点为在传感器位置(0,0,0)。
但所有结果都不好。
我评估一个单点将我的结果与Kinect在我的应用程序中提供的Head 3D坐标进行比较:
根据3D骨架跟踪器
Head = [-0.0047, 0.3932, 1.4592]
(以米为单位的3D坐标)
根据我的职能:
xv = 313
yv = 115
zw = 1360
unproject(xv, yv, zw)
POS3D = [-0.4809 0.1794 1.3500]
(以米为单位的3D坐标)
你可以观察到这两个结果是不同的,主要是在x分量上。
我的问题是配方是否错误,或者我使用的任何参数都过大。 如果是这种情况,你可以与我分享这个功能吗?
另一个问题是,骨架3D数据是否需要使用后期处理?
谢谢,
答案 0 :(得分:1)
虽然公式似乎是正确的,但出现了问题,因为如果我将它与提供值一起使用,我会得到一个完全不同的结果。但即使它是正确的,也可能与it uses filtering per default以来从MS SDK骨架跟踪中获得的位置不一样。
这取决于用例。你例如如果你不过滤结果,可能会产生强烈的抖动(见上文)。但是对于某些情况(例如找到ROI),不需要进行后处理。