最近我一直在努力尝试与Kinect的面部识别,使用新的开发工具包(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)的阴谋是所有的地方。 所以我就断定我不能使用面部识别这种方法。 我不能让我需要跟踪这样小的距离精度。
我的目标是能够识别人,因为他们进入房间,挽救他们的“个人资料”,然后将其删除时,一旦他们退出。 很抱歉,如果这是一个有点多,但我只是想解释我迄今所取得的进展。 SO,你们认为怎么样我怎么能实现面部识别? 任何想法/帮助将不胜感激。
如果使用一个EnumIndexableCollection<FeaturePoint, PointF>
因此可以使用一个FaceTrackFrame
的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();
然后你就可以在你的形象使用每个点。 我想有一个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<>
布尔其中coorispond的距离设置为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;
}
希望这可以帮助!
您附上的图片是指2D模型。 GetProjected3DShape
无关与图片。
使用IFTResult.Get2DShapePoints
获得2D面点。 如果您使用的是FaceTrackingBasics-WPF例如,你必须写该方法的C#包装。
我从事这样一个为我的硕士学位项目,我使用马氏距离是规模不变计算距离。 这里是下式:d(X,Y)= SQRT(POW((XI-易),2)/的Pow(的Si,2)); I:1 - > N,其中S是Xi和Yi的在样品组的标准偏差。 这是维基百科链接: http://en.wikipedia.org/wiki/Mahalanobis_distance