c# - 为 Kinects 深度场创建 3D 面部网格

标签 c# kinect kinect-sdk

Kinect SDK 附带了一个在颜色流上创建面部网格的示例。看起来像:

http://imgur.com/TV6dHBC

我想为深度流创建一个 3D 网格

我的代码目前如下所示:

private EnumIndexableCollection<FeaturePoint, PointF> facePoints;
private EnumIndexableCollection<FeaturePoint, Vector3DF> depthPoints;

public void DrawFaceModel(DrawingContext drawingContext)
{
    if (!this.lastFaceTrackSucceeded || this.skeletonTrackingState != SkeletonTrackingState.Tracked)
        return;

    var faceModelPts = new List<Point>();
    var faceModelPts3D = new List<Point3D>();
    var faceModel = new List<FaceModelTriangle>();
    var faceModel3D = new List<FaceModelTriangle3D>();

    for (int i = 0; i < this.facePoints.Count; i++)
    {
        faceModelPts3D.Add(new Point3D(this.depthPoints[i].X + 0.5f, this.depthPoints[i].Y + 0.5f, this.depthPoints[i].Z + 0.5f));
    }

    FaceDataPoints.Number_of_Points = this.facePoints.Count;

    foreach (var t in ImageData.faceTriangles)
    {
        var triangle = new FaceModelTriangle3D();
        triangle.Point1_3D = faceModelPts3D[t.First];
        triangle.Point2_3D = faceModelPts3D[t.Second];
        triangle.Point3_3D = faceModelPts3D[t.Third];
        faceModel3D.Add(triangle);
    }

    var faceModelGroup = new GeometryGroup();
    for (int i = 0; i < faceModel.Count; i++)
    {
        var faceTriangle = new GeometryGroup();  
        faceTriangle.Children.Add(new LineGeometry(faceModel3D[i].Point1_3D, faceModel3D[i].Point2_3D)); 
        faceTriangle.Children.Add(new LineGeometry(faceModel3D[i].Point2_3D, faceModel3D[i].Point3_3D));
        faceTriangle.Children.Add(new LineGeometry(faceModel3D[i].Point3_3D, faceModel3D[i].Point1_3D));
        faceModelGroup.Children.Add(faceTriangle); //Add lines to image
    }

    drawingContext.DrawGeometry(Brushes.LightYellow, new Pen(Brushes.LightYellow, 1.0), faceModelGroup);
}

private struct FaceModelTriangle3D
{
     public Point3D Point1_3D;
     public Point3D Point2_3D;
     public Point3D Point3_3D;
}

我目前遇到错误 “错误 2 参数 1:无法从‘System.Windows.Media.Media3D.Point3D’转换为‘System.Windows.Point’ F:\Work\Uni\4th Year\Final Year Project\Project\Project 3.0\Project 3.0\FaceTrackingViewer.xaml.cs 275 68 项目 3.0 "

这是由于:

(new LineGeometry(faceModel3D[i].Point2_3D, faceModel3D[i].Point3_3D));

我需要使用什么来代替 LineGeometry 才能使它正常工作,或者有更有效的方法吗?

此外,一旦我创建了面部网格,我还希望能够存储此信息,以便能够计算面部各点之间的距离。那么我将如何存储三角形信息呢?

最佳答案

面部跟踪基础 WPF 示例使用 Point2D,但您使用的是 Point3D。

这意味着您将 3D 坐标传递给用于 2D 绘图的 LineGeometry 构造函数。您需要将 3D 世界坐标转换为 2D 屏幕坐标;一个称为投影的过程。

WPF 包含一个透视相机类,应该可以胜任这项工作

System.Windows.Media.Media3D.PerspectiveCamera

查看在 WPF 中创建 3D 场景 - MSDN

关于c# - 为 Kinects 深度场创建 3D 面部网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14647982/

相关文章:

c# - Xamarin.Forms 在运行时删除文件 iOS

c# - 在 C# 中使不安全代码变得安全

c# - 为什么组合框在创建时会加倍其项目?

opencv - 3D映射到RGB的深度(Kinect OpenNI深度图到OpenCV RGB凸轮)

c# - 如何使用我的可执行文件链接安装 Kinect Runtime?

c# - 颜色空间点到深度空间点

c# - 如何在C#中将类似$ 1,248.99的货币字符串转换为小数?

c++ - 将 cv::Mat 转换为 openni::VideoFrameRef

c++ - 使用 Kinect c++ 去除背景

c++ - Kinect SDK c++ 抓取和按下手势