image-processing - 使用 Kinect 进行人脸识别

标签 image-processing kinect face-detection

最近,我一直在使用新的 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)。

然后我跟踪我的脸(加上几个 friend )并使用基本代数计算点 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

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

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

最佳答案

如果您使用 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 以及由公式得出的深度

preferredDistance / currentDistance



例子:
        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<>要搜索的距离。
我还建议你有一个 List<>对应于
如果结果匹配,则将距离设置为 true,这样您就可以跟踪哪个
bool 是真/假。
例子:
        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;
        } 

希望这可以帮助!

关于image-processing - 使用 Kinect 进行人脸识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263501/

相关文章:

android - 运行用于人脸检测的 OpenCV 示例时,将网络摄像头与 Android 模拟器结合使用

android - 函数无效自适应阈值OpenCV android中的错误CV_8UC1

c++ - 如何找到图像的非方形 ROI?

python - 为什么 inpaint 方法不能从 IC 图像中删除文本?

python - opencv 将附近像素设为白色

kinect - 使用网络摄像头/第二个网络摄像头注册/覆盖 kinect 深度配置文件

c++ - G Fanelli 论文中的 Head Pose Estimation on Random Forest

java和haarcascade人脸和嘴巴检测——嘴当 Nose

带有picamera的python人脸检测树莓派

Kinect2 原始深度到距离(以米为单位)