如果您使用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;
double currentDistance =
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 *
然后你可以拥有一个距离搜索结果的 List<>
。我建议你还要有一个布尔类型的 List<>
,与距离对应,如果结果匹配则将其设置为 true ,这样你就可以追踪哪些布尔值是 true/false 了。
示例:
List<double> DistanceFromEyeToNose = new List<double>
{
1,
2,
3
};
List<bool> IsMatch = new List<bool>
{
false,
false,
false
};
然后使用
for
循环进行搜索。
for (int i = 0
{
if (result == DistanceFromEyeToNose[i]) IsMatch[i] = true
}
希望这能帮到你!