【问题标题】:Facial Recognition with Kinect使用 Kinect 进行面部识别
【发布时间】:2012-07-01 02:04:23
【问题描述】:

最近我一直在尝试使用 Kinect 进行面部识别,使用新的 Developer Toolkit (v1.5.1)。可以在此处找到 FaceTracking 工具的 API:http://msdn.microsoft.com/en-us/library/jj130970.aspx。基本上到目前为止,我尝试做的是获得每个人独有的“面部特征”。为此,我引用了 Kinect 跟踪的这些面部点:()。

然后我跟踪我的脸(加上几个朋友)并使用基本代数计算点 39 和 8 之间的距离。我还获得了当前头部深度的值。以下是我获得的数据样本:

DISTANCE FROM RIGHT SIDE OF NOSE TO LEFT EYE: 10.1919198899636
CURRENT DEPTH OF HEAD: 1.65177881717682
DISTANCE FROM RIGHT SIDE OF NOSE TO LEFT EYE: 11.0429381713623
CURRENT DEPTH OF HEAD: 1.65189981460571
DISTANCE FROM RIGHT SIDE OF NOSE TO LEFT EYE: 11.0023324541865
CURRENT DEPTH OF HEAD: 1.65261101722717

这些只是我获得的一些价值。所以我的下一步是使用 excel 绘制它们。我的预期结果是深度和距离之间的线性趋势。因为随着深度的增加,距离应该更小,反之亦然。所以对于人 X 的数据,趋势是相当线性的。但对于我的朋友(Y 人)来说,情节到处都是。所以我得出结论,我不能用这种方法进行面部识别。我无法获得跟踪如此短距离所需的精度。

我的目标是能够在人们进入房间时识别他们,保存他们的“个人资料”,然后在他们退出时将其删除。对不起,如果这有点多,但我只是想解释我到目前为止所取得的进展。那么,你们如何看待我如何实现面部识别?任何想法/帮助将不胜感激。

【问题讨论】:

  • 请添加一些代码/甚至是您使用的代数,以及距离图

标签: image-processing kinect face-detection


【解决方案1】:

我正在为我的硕士学位从事一个像这样的项目,并且我正在使用比例不变的马氏距离计算距离。这是公式: d(x,y)=sqrt(Pow((Xi-Yi),2)/Pow(Si,2)) ; i:1-->N,其中 Si 是样本集上 Xi 和 Yi 的标准差。这是维基百科链接:http://en.wikipedia.org/wiki/Mahalanobis_distance

【讨论】:

    【解决方案2】:

    您附上的图片是指二维模型。 GetProjected3DShape与图片无关。

    使用IFTResult.Get2DShapePoints 获取二维人脸点。如果您使用的是 FaceTrackingBasics-WPF 示例,则必须为该方法编写 C# 包装器。

    【讨论】:

    【解决方案3】:

    如果您使用EnumIndexableCollection<FeaturePoint, PointF> 所以你可以使用FaceTrackFrameGetProjected3DShape() 方法。 你可以这样使用它:

      private byte[] colorImage;
    
      private ColorImageFormat colorImageFormat = ColorImageFormat.Undefined;
    
      private short[] depthImage;
    
      private DepthImageFormat depthImageFormat = DepthImageFormat.Undefined;
    
      KinectSensor Kinect = KinectSensor.KinectSensors[0];
    
      private Skeleton[] skeletonData;
    
      colorImageFrame = allFramesReadyEventArgs.OpenColorImageFrame();
      depthImageFrame = allFramesReadyEventArgs.OpenDepthImageFrame();
      skeletonFrame = allFramesReadyEventArgs.OpenSkeletonFrame();
      colorImageFrame.CopyPixelDataTo(this.colorImage);
      depthImageFrame.CopyPixelDataTo(this.depthImage);
      skeletonFrame.CopySkeletonDataTo(this.skeletonData);
      skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength];
    
      foreach(Skeleton skeletonOfInterest in skeletonData)
      {
           FaceTrackFrame frame = faceTracker.Track(
               colorImageFormat, colorImage, depthImageFormat, depthImage, skeletonOfInterest);
      }
    
      private EnumIndexableCollection<FeaturePoint, PointF> facePoints = frame.GetProjected3DShape();
    

    然后您可以使用图像中的每个点。 我会有一个const double preferedDistance,你可以乘以当前 深度和 x 和 y 的不同点找到首选版本 x 和 y 的深度和公式

    首选距离/当前距离

    例子:

            const double preferredDistance = 500.0;//this can be any number you want.
    
            double currentDistance = //however you are calculating the distance
    
            double whatToMultiply = preferredDistance / currentDistance;
    
            double x1 = this.facePoints[39].X;
            double y1 = this.facePoints[39].Y;
            double x2 = this.facePoints[8].X;
            double y2 = this.facePoints[8].Y;
    
            double result = whatToMultiply * //however you are calculating distance.
    

    然后你可以有一个List&lt;&gt; 来说明要搜索的距离。 我还建议你有一个 List&lt;&gt; 的 bool 与 如果结果匹配,则设置为 true 的距离,因此您可以跟踪哪个 布尔是真/假。
    示例:

            List<double> DistanceFromEyeToNose = new List<double>
            {
                1,
                2,
                3 //etc
            };
    
    
            List<bool> IsMatch = new List<bool>
            {
                false,
                false,
                false //etc
            };
    

    然后使用for 循环搜索它。

            for (int i = 0; i < DistanceFromEyeToNose.Count; i++)
            {
                if (result == DistanceFromEyeToNose[i]) IsMatch[i] = true;
            } 
    

    希望这会有所帮助!

    【讨论】:

    • 仍在开发中...我开始怀疑 Kinect 的面部识别功能。
    • @Ray 记住 Kinect 不是为识别你的脸而设计的,你应该得到不止一个距离的数量
    • @Ray 因为在聊天中你提到你正在迁移到 Aforge.NET,如果这对 this 问题有帮助,请接受
    猜你喜欢
    • 2012-02-16
    • 2012-11-16
    • 2012-12-10
    • 2017-11-25
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多