10

最近、新しい Developer Toolkit (v1.5.1) を使用して、Kinect で顔認識を試すことに取り組んでいます。FaceTracking ツールの API は、http://msdn.microsoft.com/en-us/library/jj130970.aspx にあります。基本的に私がこれまで試みてきたことは、各人に固有の「顔の署名」を取得することです。これを行うために、Kinect トラック ( http://i.msdn.microsoft.com/dynimg/IC584330.png) のこれらの顔のポイントを参照しました。

次に、自分の顔 (および数人の友人) を追跡し、基本代数を使用して点 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 さん) にとっては、陰謀はいたるところにありました。したがって、この方法を顔認識に使用することはできないという結論に達しました。このような短い距離を追跡するために必要な精度を得ることができません。

私の目標は、部屋に入る人を識別し、「プロファイル」を保存し、退室時に削除できるようにすることです。これが少し多かった場合は申し訳ありませんが、これまでの進捗状況を説明しようとしています. では、顔認識を実装する方法についてどう思いますか? どんなアイデア/ヘルプも大歓迎です。

4

3 に答える 3

4

a を使用する場合は、 aのメソッド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();

次に、画像内の各ポイントを使用できます。現在の深度とさまざまなポイントの x と y を乗算してconst double preferedDistance、式によって 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<>、検索する距離を取得できます。また、結果が一致する場合に true に設定する距離に対応する boolがあることをお勧めしますList<>。これにより、どの bool が true/false であるかを追跡できます。
例:

        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;
        } 

お役に立てれば!

于 2012-07-01T15:16:52.327 に答える