对于我的应用,我分析了Kinect v2的空间分辨率 .
为了分析空间分辨率,我将垂直和平面平面记录到给定距离,并将平面的深度图转换为点 Cloud . 然后我通过计算欧几里德距离来比较一个点与他的邻居 .
计算这种情况下的欧几里德距离(平面和kinect之间1米),点之间的分辨率接近3毫米 . 对于距离为2米的飞机,我的分辨率最高可达3毫米 .
与文献相比,我认为我的结果非常糟糕 .
例如Yang等人 . 得到一架距离为4米的飞机,平均分辨率为4毫米(Evaluating and Improving the Depth Accuracy of Kinect for Windows v2)
这是我的平面平面点 Cloud (距离我的kinect 2米)的示例:
有人对Kinect v2的空间分辨率做了一些观察,或者想出为什么我的分辨率不那么糟糕?
在我看来,我认为将我的深度图像转换为世界坐标时出现了问题 . 因此这里的代码剪断了:
%normalize image points by multiply inverse of K
u_n=(u(:)-c_x)/f_x;
v_n=(v(:)-c_y)/f_y;
% u,v are uv-coordinates of my depth image
%calc radial distortion
r=sqrt(power(u_n,2)+power(v_n,2));
radial_distortion =1.0 + radial2nd * power(r,2) + radial4nd * power(r,4) + radial6nd * power(r,6);
%apply radial distortion to uv-coordinates
u_dis=u_n(:).*radial_distortion;
v_dis=v_n(:).*radial_distortion;
%apply cameramatrix to get undistorted depth point
x_depth=u_dis*f_x+c_x;
y_depth=v_dis*f_y+c_y;
%convert 2D to 3D
X=((x_depth(:)-c_x).*d(:))./f_x;
Y=((y_depth(:)-c_y).*d(:))./f_y;
Z=d; % d is the given depth value at (u,v)
EDIT: 到目前为止,我还尝试直接从_2465640中包含点而无需进一步的校准步骤 .
有关分辨率的结果仍然相同 . 有没有人比较结果?
1 回答
@JavaNullPointer,您使用Kinect v2将信息转换为3D的方式仍未被社区广泛接受 .
你正在进行的那些计算也非常关注Nicholas Burrus的工作 - http://burrus.name/index.php/Research/KinectCalibration
对于Kinect v2,还没有太多关于如何做到这一点的信息 . 不过,新的SDK功能允许您保存Kinect校准表空间 .
程序很简单:
1-您需要保存此表信息 - https://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.getdepthframetocameraspacetable.aspx
2-一旦将此信息保存到文件,您就可以将深度点(2D)转换为3D相机空间 .
这里是您应该使用的代码:
另外,请花很多时间:
https://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.mapdepthframetocameraspace.aspx
要么
https://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.mapdepthframetocameraspaceusingibuffer.aspx
此外,深度,红外,bodyindex流都是对齐的(相同的分辨率)因此你真的这样 . 如果您还需要获取色点,则还应保存该映射 . 所有这些信息都可以在Kinect MSDN 2.0网站上找到 .
我希望您能够保存此信息,然后重新执行此空间分辨率测试 .