Kinect v2传感器是微软推出的一款深度摄像头,它能够捕捉空间中的三维信息,广泛应用于增强现实、3D建模等领域。本文将介绍如何使用Kinect v2 SDK进行点云扫描,并提供一些优化深度质量的方法。
在开始之前,确保已经安装了以下软件和工具:
首先,启动KinectPointCloud.exe程序。在程序界面上,勾选“Save if depth frame ...”选项,然后点击“Capture”按钮开始扫描。在扫描过程中,请保持静止,直到图像质量达到“Depth OK…”超过45%。
扫描完成后,点击“Show Point Cloud”按钮查看点云。可以选择查看带有颜色信息的点云,或者仅查看深度信息。此外,还可以将点云导出到外部工具(如MeshLab)进行进一步编辑。
本项目使用了多种开源代码,包括:
使用标准的Microsoft示例代码从Kinect提取点云可能会得到较差的结果,例如,高达30%的深度帧点会丢失深度信息。为了提高深度质量,采用了帧插值的方法。
具体来说,捕获10帧图像,然后计算这些帧的平均深度值。为了检查捕获图像的质量,还计算了一个“熵”图像,它由最大深度和最小深度之间的差值组成。如果一个像素的熵为零(所有测量值显示相同的深度),则该像素的质量最好;如果熵值更高,则像素质量更差。
此外,还会计算深度直方图。在直方图中,x轴表示深度精度(从0到32),所有高于32的深度精度都被忽略,因为它们占总扫描点的不到1%。y轴表示点的数量。
MainWindow.xaml是主窗口,负责所有Kinect操作的类是KinectUC。以下是一些关键的代码片段:
开始捕获:
private void buttonConnect_Click(object sender, RoutedEventArgs e)
{
KinectConnect();
}
保存点云:
private void buttonSave_Click(object sender, RoutedEventArgs e)
{
SaveDepthPoints();
SaveDepthBitmap();
SaveDepthPointsInterpolated();
SaveImageInterpolated();
SaveColorBitmap();
SaveColorInfoForDepth_FileAndImage();
}
显示点云:
private void buttonShowPointCloud_Click(object sender, RoutedEventArgs e)
{
this.OpenSavedDepthData();
ShowDepthScreenshot();
FormVTK vtkForm = new FormVTK();
vtkForm.ShowPointCloud(this.DepthMetaData.FrameData, DepthMetaData.XResDefault, DepthMetaData.YResDefault);
}
还有一些用于处理Kinect数据的实用工具,例如:
namespace KinectUtils
{
public class DepthMetaData : MetaDataBase
{
...
public WriteableBitmap DepthBitmap
{
get
{
if (depthBitmap == null)
{
this.pixels = ImageUtil.ConvertUshortToByte(this.FrameData);
depthBitmap = ImageUtil.ByteArrayToWriteableBitmap_Gray(pixels, DepthMetaData.XResDefault, DepthMetaData.YResDefault);
}
return depthBitmap;
}
}
}
或者VTK处理,例如:
public class ColorUtils
{
...
}
深度统计只有在目标和扫描仪静止不动时才有效。如果发生大的移动,百分比值可能不会加起来等于100%。原因是,如果传感器或扫描目标移动,从图像中切出的深度点会有所不同。
如果使用本文描述的图像插值和仅在深度精度高时保存点云的程序,可以使用Microsoft Kinect v2相机扫描出质量可接受的点云。
本文中的代码和所有信息可以在任何应用程序中使用,只要在致谢中引用本文。
对将从不同角度扫描的点云拼接在一起感兴趣,然后把它们组合起来以获得更好的点云,例如使用某种ICP算法。任何建议或更好的C#代码,如果适合这里使用的架构,将非常受欢迎。
"Kinect-Point-Cloud-using-OpenGL" - 本文展示了在OpenGL控件中的UI。对于后续的Kinect工作,将使用OpenGL控件。然而,保留了VTK的代码,供对此感兴趣的人使用,以及以后使用其他VTK示例。