Ответ 1
Если вы используете 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 и глубиной по формуле
Предпочтительное сопротивление/сопротивление тока
Пример:
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<>
bool, которые согласны с
расстояния до значения true, если результат совпадает, поэтому вы можете отслеживать, какие
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;
}
Надеюсь, что это поможет!