2013-02-01 29 views
3

Kinect SDK附帶了在顏色流中創建人臉網格的示例。這看起來像:爲Kinects深度字段創建3D人臉網格

http://imgur.com/TV6dHBC

我想創建一個三維網格的深度流

我的代碼目前看起來如下:

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的得到這個工作還是有這樣做的更有效的方式?

另外,一旦我創建了臉部網格,我也希望能夠存儲此信息以便能夠計算臉部上的點之間的距離。那麼我將如何去存儲三角形信息呢?

回答

0

人臉跟蹤基礎知識WPF示例使用Point2D,但您使用的是Point3D。

這意味着您將3D座標傳遞給LineGeometry構造函數,該構造函數用於2D繪圖。您需要將3D世界座標轉換爲2D屏幕座標;一個被稱爲投影的過程。

WPF包括這應該是由工作

System.Windows.Media.Media3D.PerspectiveCamera 

透視相機類看看積極創建WPF 3D場景 - MSDN

0

How to get mesh from kinect fracetrack?

而對於第二個問題:
三角信息給你的臉,所以如果你想存儲在例如一個 。OBJ,然後

  1. 頂點:vxyz
    (X,Y,Z,應與代表座標對應的數字代替,而v是要註明你所列出的頂點)

  2. 從面孔三角:fijk
    (X,Y,Z應該與代表座標相應的數字來代替,而f爲以表示正在上市的面)

amd你有你的.obj

如果你將它存儲在程序中,那麼我會建議兩個容器(可能是數組或鏈接列表取決於你想要的),一個用於頂點,一個用於面或者有一個類來存儲所有。