使用Kinect进行面部识别

时间:2012-06-29 14:19:46

标签: 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)。

然后我跟踪了我的脸(加上几个朋友)并使用基本代数计算了第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人)来说,情节到处都是。所以我得出结论,我不能使用这种方法进行面部识别。我无法获得跟踪如此小距离所需的精度。

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

3 个答案:

答案 0 :(得分:4)

如果您使用EnumIndexableCollection<FeaturePoint, PointF>  因此,您可以使用FaceTrackFrame的{​​{1}}方法。  你这样使用它:

GetProjected3DShape()

然后您可以使用图像中的每个点。  我会有 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的不同点找到首选版本 x和y'以及公式的深度

  

preferredDistance / currentDistance

示例:

const double preferedDistance

然后你可以得到 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<>的bool与coorispond 如果结果匹配,则设置为true的距离,以便您可以跟踪哪些  bool是真/假。
示例:

List<>

然后使用 List<double> DistanceFromEyeToNose = new List<double> { 1, 2, 3 //etc }; List<bool> IsMatch = new List<bool> { false, false, false //etc }; 循环搜索它。

for

希望这有助于!

答案 1 :(得分:0)

您附加的图片是指2D模型。 GetProjected3DShape与图片无关。

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

答案 2 :(得分:0)

我正在为我的硕士学位这样的项目工作,我使用马哈拉诺比斯距离计算距离,这是规模不变的。这是公式:d(x,y)= sqrt(Pow((Xi-Yi),2)/ Pow(Si,2)); i:1 - > N,其中Si是样品组上Xi和Yi的标准偏差。这是维基百科链接:http://en.wikipedia.org/wiki/Mahalanobis_distance