public void PhotoLoaded(LuxandFaceRecognition recognizer, string photoPath) { this.recognizer = recognizer; headTextureId = TextureHelper.GetTexture(photoPath); ReloadModel(); HeadMesh.DetectFaceRotationEmgu(); ImportPoints(); ProjectedPoints.Initialize(recognizer, HeadPoints); headMorphing.Initialize(recognizer, HeadPoints); morphHelper.ProcessPoints(ProjectedPoints, HeadPoints); headMorphing.Morph(); ApplySmoothedTextures(); // Для автоматического текстурирования раскомментить эту строку. А так - подвесил на кнопку. ResetCamera(); additionalMorphing.Type = HeadMesh.HeadAngle < 0.0f ? MorphTriangleType.Left : MorphTriangleType.Right; additionalMorphing.Initialize(HeadMesh, ProjectedPoints, headMorphing); additionalMorphing.ProcessPoints(ProjectedPoints); /*additionalMorphing.IsReversed = true; * additionalMorphing.Initialize(HeadMesh, ProjectedPoints, headMorphing); * additionalMorphing.ProcessPoints(ProjectedPoints);*/ //HeadMesh.RotationMatrix = HeadMesh.ReverseRotationMatrix; }
public static void InitializeFaceAgeImage(string path) { var fcr = new LuxandFaceRecognition(); fcr.Recognize(ref path, false, true); Recognizer = fcr; }
public void LoadPhoto() { using (var ofd = new OpenFileDialogEx("Select template file", "Image Files|*.jpg;*.png;*.jpeg;*.bmp")) { ofd.Multiselect = false; if (ofd.ShowDialog() != DialogResult.OK) { return; } templateImage = ofd.FileName; Recognizer = new LuxandFaceRecognition(); if (!Recognizer.Recognize(ref templateImage, true)) { templateImage = string.Empty; pictureTemplate.Image = null; return; // это ОЧЕНЬ! важно. потому что мы во время распознавания можем создать обрезанную фотку и использовать ее как основную в проекте. } using (var ms = new MemoryStream(File.ReadAllBytes(templateImage))) // Don't use using!! { var img = (Bitmap)Image.FromStream(ms); pictureTemplate.Image = (Bitmap)img.Clone(); img.Dispose(); } RecalcRealTemplateImagePosition(); var eWidth = pictureTemplate.Width - 100; var TopEdgeTransformed = new RectangleF(pictureTemplate.Width / 2f - eWidth / 2f, 30, eWidth, eWidth); // затычка. нужен будет подгон верхней части бошки - сделаю var minX = Recognizer.GetMinX(); var topPoint = (TopEdgeTransformed.Y - ImageTemplateOffsetY) / ImageTemplateHeight; Recognizer.FaceRectRelative = new RectangleF(minX, topPoint, Recognizer.GetMaxX() - minX, Recognizer.BottomFace.Y - topPoint); var noseTip = Recognizer.FacialFeatures[2].Xy; var noseTop = Recognizer.FacialFeatures[22].Xy; var noseBottom = Recognizer.FacialFeatures[49].Xy; ProgramCore.MainForm.RenderControl.PhotoLoaded(Recognizer, TemplateImage); RenderTimer.Start(); if (Math.Abs(Recognizer.RotatedAngle) > 20) { MessageBox.Show("The head rotated more than 20 degrees. Please select an other photo..."); } } }
public void ApplyNewImage(string fileName) { labelHelp.Visible = false; textTemplateImage.Text = fileName; templateImage = fileName; fcr = new LuxandFaceRecognition(); if (!fcr.Recognize(ref templateImage, true)) { textTemplateImage.Text = templateImage = string.Empty; pictureTemplate.Image = null; labelHelp.Visible = true; return; // это ОЧЕНЬ! важно. потому что мы во время распознавания можем создать обрезанную фотку и использовать ее как основную в проекте. } if (fcr.IsMale) { btnMale_Click(null, null); } else { btnFemale_Click(null, null); } using (var ms = new MemoryStream(File.ReadAllBytes(templateImage))) // Don't use using!! { var img = (Bitmap)Image.FromStream(ms); pictureTemplate.Image = (Bitmap)img.Clone(); img.Dispose(); } RecalcRealTemplateImagePosition(); Single distance; if (fcr.IsMale) { distance = facialFeaturesTransformed[22].Y - facialFeaturesTransformed[11].Y; // раньше использовалась 2 точка.но согласно ТЗ от 27.3.2017 используем теперь эту точку } else { distance = facialFeaturesTransformed[2].Y - facialFeaturesTransformed[11].Y; } TopEdgeTransformed.Y = facialFeaturesTransformed[16].Y + distance; // определение высоты по алгоритму старикана TopEdgeTransformed.Y = TopEdgeTransformed.Y < 0 ? 10 : TopEdgeTransformed.Y; RenderTimer.Start(); if (ProgramCore.PluginMode) { var appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); var dazPath = Path.Combine(appDataPath, @"DAZ 3D\Studio4\temp\FaceShop\", "fs3d.obj"); if (File.Exists(dazPath)) { if (ProgramCore.CurrentProgram != ProgramCore.ProgramMode.HeadShop_OneClick && ProgramCore.CurrentProgram != ProgramCore.ProgramMode.HeadShop_v11 && ProgramCore.CurrentProgram != ProgramCore.ProgramMode.HeadShop_OneClick_v2) { rbImportObj.Checked = true; } CustomModelPath = dazPath; } else { MessageBox.Show(@"Daz model not found.", @"HeadShop", MessageBoxButtons.OK); } } if (Math.Abs(fcr.RotatedAngle) > 25) { MessageBox.Show("The head rotated more than 20 degrees. Please select an other photo..."); } else { btnApply.Enabled = true; } }
private void Recognize(Bitmap sourceImage) { var facialFeatures = new List <Vector3>(); var pointDepths = LuxandFaceRecognition.GetPointDepths(); int index = 0; var pointFeature = GetFeaturePoints(sourceImage); foreach (var point in pointFeature) { facialFeatures.Add(new Vector3(point.x / (sourceImage.Width * 1f), point.y / (sourceImage.Height * 1f), pointDepths[index++])); } var LeftEyeCenter = new Vector2(pointFeature[0].x, pointFeature[0].y); LeftEyeCenter = new Vector2(LeftEyeCenter.X / (sourceImage.Width * 1f), LeftEyeCenter.Y / (sourceImage.Height * 1f)); var RightEyeCenter = new Vector2(pointFeature[1].x, pointFeature[1].y); RightEyeCenter = new Vector2(RightEyeCenter.X / (sourceImage.Width * 1f), RightEyeCenter.Y / (sourceImage.Height * 1f)); var LeftMouth = new Vector2(pointFeature[3].x, pointFeature[3].y); var RightMouth = new Vector2(pointFeature[4].x, pointFeature[4].y); LeftMouth = new Vector2(LeftMouth.X / (sourceImage.Width * 1f), LeftMouth.Y / (sourceImage.Height * 1f)); RightMouth = new Vector2(RightMouth.X / (sourceImage.Width * 1f), RightMouth.Y / (sourceImage.Height * 1f)); var BottomFace = new Vector2(pointFeature[11].x, pointFeature[11].y); BottomFace = new Vector2(BottomFace.X / (sourceImage.Width * 1f), BottomFace.Y / (sourceImage.Height * 1f)); var TopFace = new Vector2(pointFeature[66].x, pointFeature[66].y); var MiddleFace1 = new Vector2(pointFeature[66].x, pointFeature[66].y); var MiddleFace2 = new Vector2(pointFeature[5].x, pointFeature[5].y); TopFace = new Vector2(TopFace.X / (sourceImage.Width * 1f), TopFace.Y / (sourceImage.Height * 1f)); MiddleFace1 = new Vector2(MiddleFace1.X / (sourceImage.Width * 1f), MiddleFace1.Y / (sourceImage.Height * 1f)); MiddleFace2 = new Vector2(MiddleFace2.X / (sourceImage.Width * 1f), MiddleFace2.Y / (sourceImage.Height * 1f)); var RightMiddleFace1 = new Vector2(pointFeature[67].x, pointFeature[67].y); var RightMiddleFace2 = new Vector2(pointFeature[6].x, pointFeature[6].y); RightMiddleFace1 = new Vector2(RightMiddleFace1.X / (sourceImage.Width * 1f), RightMiddleFace1.Y / (sourceImage.Height * 1f)); RightMiddleFace2 = new Vector2(RightMiddleFace2.X / (sourceImage.Width * 1f), RightMiddleFace2.Y / (sourceImage.Height * 1f)); var distance = facialFeatures[2].Y - facialFeatures[11].Y; // а хз. старикан попросил чуть ниже брать, но не объяснил как. var topPoint = facialFeatures[16].Y + distance; var minX = GetMinX(TopFace, MiddleFace1, MiddleFace2); ProgramCore.Project.FaceRectRelative = new RectangleF(minX, topPoint, GetMaxX(TopFace, RightMiddleFace1, RightMiddleFace2) - minX, BottomFace.Y - topPoint); ProgramCore.Project.MouthCenter = new Vector2(LeftMouth.X + (RightMouth.X - LeftMouth.X) * 0.5f, LeftMouth.Y + (RightMouth.Y - LeftMouth.Y) * 0.5f); ProgramCore.Project.LeftEyeCenter = LeftEyeCenter; ProgramCore.Project.RightEyeCenter = RightEyeCenter; ProgramCore.Project.FaceColor = LuxandFaceRecognition.GetFaceColor(sourceImage, pointFeature); ProgramCore.Project.DetectedLipsPoints.Clear(); ProgramCore.Project.DetectedNosePoints.Clear(); ProgramCore.Project.DetectedBottomPoints.Clear(); ProgramCore.Project.DetectedTopPoints.Clear(); ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[3]); // точки рта ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[58]); ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[55]); ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[59]); ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[4]); ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[57]); ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[56]); ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[61]); //Центр рта верх ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[64]); //Центр рта низ ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[60]); //9 ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[62]); //10 ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[63]); //11 ProgramCore.Project.DetectedLipsPoints.Add(facialFeatures[65]); //12 ProgramCore.Project.DetectedNosePoints.Add(facialFeatures[45]); // точки носа ProgramCore.Project.DetectedNosePoints.Add(facialFeatures[46]); ProgramCore.Project.DetectedNosePoints.Add(facialFeatures[2]); ProgramCore.Project.DetectedNosePoints.Add(facialFeatures[22]); ProgramCore.Project.DetectedNosePoints.Add(facialFeatures[49]); ProgramCore.Project.DetectedLeftEyePoints.Add(facialFeatures[23]); //Точки левого глаза ProgramCore.Project.DetectedLeftEyePoints.Add(facialFeatures[28]); ProgramCore.Project.DetectedLeftEyePoints.Add(facialFeatures[24]); ProgramCore.Project.DetectedLeftEyePoints.Add(facialFeatures[27]); ProgramCore.Project.DetectedRightEyePoints.Add(facialFeatures[25]); //Точки правого глаза ProgramCore.Project.DetectedRightEyePoints.Add(facialFeatures[32]); ProgramCore.Project.DetectedRightEyePoints.Add(facialFeatures[26]); ProgramCore.Project.DetectedRightEyePoints.Add(facialFeatures[31]); ProgramCore.Project.DetectedBottomPoints.Add(facialFeatures[5]); //точки нижней части лица ProgramCore.Project.DetectedBottomPoints.Add(facialFeatures[7]); // * 0.75f + facialFeatures[9] * 0.25f); var p11 = facialFeatures[11]; ProgramCore.Project.DetectedBottomPoints.Add(new Vector3((p11.X + facialFeatures[9].X) * 0.5f, p11.Y, facialFeatures[9].Z)); ProgramCore.Project.DetectedBottomPoints.Add(new Vector3((p11.X + facialFeatures[10].X) * 0.5f, p11.Y, facialFeatures[10].Z)); ProgramCore.Project.DetectedBottomPoints.Add(facialFeatures[8]);// * 0.75f + facialFeatures[10] * 0.25f); ProgramCore.Project.DetectedBottomPoints.Add(facialFeatures[6]); ProgramCore.Project.DetectedBottomPoints.Add(facialFeatures[66]); ProgramCore.Project.DetectedBottomPoints.Add(facialFeatures[68]); ProgramCore.Project.DetectedBottomPoints.Add(facialFeatures[69]); ProgramCore.Project.DetectedBottomPoints.Add(facialFeatures[67]); ProgramCore.Project.DetectedTopPoints.Add(facialFeatures[66]); ProgramCore.Project.DetectedTopPoints.Add(facialFeatures[67]); }
public void Initialize(LuxandFaceRecognition recognizer, HeadPoints hPoints) { MirroredPoints.Clear(); AutodotsTexCords.Clear(); for (int i = 0; i < MorphHelper.mirroredPoints.Count; i += 2) { MirroredPoints.Add(MorphHelper.mirroredPoints[i], MorphHelper.mirroredPoints[i + 1]); MirroredPoints.Add(MorphHelper.mirroredPoints[i + 1], MorphHelper.mirroredPoints[i]); } headPoints = hPoints; var headMesh = headPoints.HeadMesh; var a = headMesh.AABB.A; var b = headMesh.AABB.B; var b1 = new Vector3(a.X, b.Y, b.Z); var b2 = new Vector3(a.X, a.Y, b.Z); var b3 = new Vector3(b.X, a.Y, b.Z); float centerX = (a.X + b.X) * 0.5f; float centerZ = (a.Z + b.Z) * 0.5f; var a1 = new Vector3(centerX, a.Y, centerZ); var a2 = new Vector3(centerX, b.Y, centerZ); foreach (var point in recognizer.FacialFeatures) { AutodotsTexCords.Add(point.Xy); } headPoints.Points.Add(b); //70 AutodotsTexCords.Add(new Vector2(1f, 0f)); headPoints.Points.Add((b + b1) * 0.5f); //71 AutodotsTexCords.Add(new Vector2(0.5f, 0f)); headPoints.Points.Add(b1); //72 AutodotsTexCords.Add(new Vector2(0f, 0f)); headPoints.Points.Add((b1 + b2) * 0.5f); //73 AutodotsTexCords.Add(new Vector2(0f, 0.5f)); headPoints.Points.Add(b2); //74 AutodotsTexCords.Add(new Vector2(0f, 1f)); headPoints.Points.Add((b2 + b3) * 0.5f); //75 AutodotsTexCords.Add(new Vector2(0.5f, 1f)); headPoints.Points.Add(b3); //76 AutodotsTexCords.Add(new Vector2(1f, 1f)); headPoints.Points.Add((b3 + b) * 0.5f); //77 AutodotsTexCords.Add(new Vector2(1f, 0.5f)); headPoints.Points.Add(a1); //78 headPoints.Points.Add(a2); //79 MirroredPoints.Add(72, 70); MirroredPoints.Add(73, 77); MirroredPoints.Add(74, 76); MirroredPoints.Add(70, 72); MirroredPoints.Add(77, 73); MirroredPoints.Add(76, 74); headPoints.IsVisible.AddRange(Enumerable.Repeat(true, 10)); #region TrianglesFront // left oval //TrianglesFront.Add(new MorphTriangle { A = 52, B = 3, C = 68, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 52, B = 5, C = 68, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 52, B = 66, C = 68, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 66, B = 73, C = 68, Type = MorphTriangleType.Left }); //TrianglesFront.Add(new MorphTriangle { A = 5, B = 3, C = 68, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 5, B = 52, C = 3, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 5, B = 74, C = 68, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 5, B = 3, C = 7, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 5, B = 74, C = 7, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 3, B = 58, C = 7, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 9, B = 58, C = 7, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 9, B = 58, C = 55, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 9, B = 55, C = 11, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 9, B = 7, C = 74, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 45, B = 66, C = 43, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 66, B = 52, C = 45, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 73, B = 74, C = 68, Type = MorphTriangleType.Left }); TrianglesFront.Add(new MorphTriangle { A = 9, B = 11, C = 75 }); TrianglesFront.Add(new MorphTriangle { A = 74, B = 75, C = 9 }); TrianglesFront.Add(new MorphTriangle { A = 23, B = 66, C = 43 }); TrianglesFront.Add(new MorphTriangle { A = 72, B = 73, C = 12 }); TrianglesFront.Add(new MorphTriangle { A = 72, B = 71, C = 16 }); TrianglesFront.Add(new MorphTriangle { A = 66, B = 12, C = 23 }); TrianglesFront.Add(new MorphTriangle { A = 66, B = 73, C = 12 }); //right oval //TrianglesFront.Add(new MorphTriangle { A = 4, B = 53, C = 69, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 69, B = 53, C = 6, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 67, B = 53, C = 69, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 67, B = 77, C = 69, Type = MorphTriangleType.Right }); //TrianglesFront.Add(new MorphTriangle { A = 6, B = 4, C = 69, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 53, B = 4, C = 6, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 6, B = 76, C = 69, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 6, B = 4, C = 8, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 6, B = 76, C = 8, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 4, B = 59, C = 8, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 10, B = 59, C = 8, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 10, B = 59, C = 55, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 10, B = 55, C = 11, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 10, B = 8, C = 76, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 46, B = 67, C = 44, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 46, B = 53, C = 67, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 76, B = 77, C = 69, Type = MorphTriangleType.Right }); TrianglesFront.Add(new MorphTriangle { A = 10, B = 11, C = 75 }); TrianglesFront.Add(new MorphTriangle { A = 75, B = 10, C = 76 }); TrianglesFront.Add(new MorphTriangle { A = 67, B = 77, C = 15 }); TrianglesFront.Add(new MorphTriangle { A = 26, B = 67, C = 44 }); TrianglesFront.Add(new MorphTriangle { A = 70, B = 77, C = 15 }); TrianglesFront.Add(new MorphTriangle { A = 26, B = 67, C = 15 }); TrianglesFront.Add(new MorphTriangle { A = 71, B = 70, C = 17 }); //left eye TrianglesFront.Add(new MorphTriangle { A = 23, B = 35, C = 37 }); TrianglesFront.Add(new MorphTriangle { A = 0, B = 35, C = 37 }); TrianglesFront.Add(new MorphTriangle { A = 28, B = 35, C = 0 }); TrianglesFront.Add(new MorphTriangle { A = 28, B = 36, C = 0 }); TrianglesFront.Add(new MorphTriangle { A = 36, B = 24, C = 38 }); TrianglesFront.Add(new MorphTriangle { A = 36, B = 0, C = 38 }); TrianglesFront.Add(new MorphTriangle { A = 27, B = 0, C = 38 }); TrianglesFront.Add(new MorphTriangle { A = 27, B = 0, C = 37 }); //left eyelash TrianglesFront.Add(new MorphTriangle { A = 23, B = 12, C = 18 }); TrianglesFront.Add(new MorphTriangle { A = 18, B = 35, C = 23 }); TrianglesFront.Add(new MorphTriangle { A = 18, B = 35, C = 16 }); TrianglesFront.Add(new MorphTriangle { A = 28, B = 35, C = 16 }); TrianglesFront.Add(new MorphTriangle { A = 28, B = 19, C = 16 }); TrianglesFront.Add(new MorphTriangle { A = 28, B = 19, C = 36 }); TrianglesFront.Add(new MorphTriangle { A = 13, B = 19, C = 36 }); TrianglesFront.Add(new MorphTriangle { A = 24, B = 22, C = 13 }); TrianglesFront.Add(new MorphTriangle { A = 13, B = 36, C = 24 }); TrianglesFront.Add(new MorphTriangle { A = 38, B = 24, C = 43 }); TrianglesFront.Add(new MorphTriangle { A = 37, B = 27, C = 43 }); TrianglesFront.Add(new MorphTriangle { A = 37, B = 23, C = 43 }); //right eye TrianglesFront.Add(new MorphTriangle { A = 26, B = 40, C = 42 }); TrianglesFront.Add(new MorphTriangle { A = 1, B = 40, C = 42 }); TrianglesFront.Add(new MorphTriangle { A = 32, B = 40, C = 1 }); TrianglesFront.Add(new MorphTriangle { A = 32, B = 39, C = 1 }); TrianglesFront.Add(new MorphTriangle { A = 39, B = 25, C = 41 }); TrianglesFront.Add(new MorphTriangle { A = 39, B = 1, C = 41 }); TrianglesFront.Add(new MorphTriangle { A = 31, B = 1, C = 41 }); TrianglesFront.Add(new MorphTriangle { A = 31, B = 1, C = 42 }); //right eyelash TrianglesFront.Add(new MorphTriangle { A = 26, B = 15, C = 21 }); TrianglesFront.Add(new MorphTriangle { A = 21, B = 40, C = 26 }); TrianglesFront.Add(new MorphTriangle { A = 21, B = 40, C = 17 }); TrianglesFront.Add(new MorphTriangle { A = 32, B = 40, C = 17 }); TrianglesFront.Add(new MorphTriangle { A = 32, B = 20, C = 17 }); TrianglesFront.Add(new MorphTriangle { A = 32, B = 20, C = 39 }); TrianglesFront.Add(new MorphTriangle { A = 14, B = 20, C = 39 }); TrianglesFront.Add(new MorphTriangle { A = 25, B = 22, C = 14 }); TrianglesFront.Add(new MorphTriangle { A = 14, B = 25, C = 39 }); TrianglesFront.Add(new MorphTriangle { A = 25, B = 41, C = 44 }); TrianglesFront.Add(new MorphTriangle { A = 31, B = 42, C = 44 }); TrianglesFront.Add(new MorphTriangle { A = 26, B = 42, C = 44 }); //middle face TrianglesFront.Add(new MorphTriangle { A = 14, B = 22, C = 13 }); // Upper part TrianglesFront.Add(new MorphTriangle { A = 12, B = 18, C = 72 }); TrianglesFront.Add(new MorphTriangle { A = 16, B = 18, C = 72 }); TrianglesFront.Add(new MorphTriangle { A = 16, B = 19, C = 71 }); TrianglesFront.Add(new MorphTriangle { A = 13, B = 19, C = 71 }); TrianglesFront.Add(new MorphTriangle { A = 13, B = 14, C = 71 }); TrianglesFront.Add(new MorphTriangle { A = 14, B = 20, C = 71 }); TrianglesFront.Add(new MorphTriangle { A = 17, B = 20, C = 71 }); TrianglesFront.Add(new MorphTriangle { A = 17, B = 21, C = 70 }); TrianglesFront.Add(new MorphTriangle { A = 15, B = 21, C = 70 }); // nose TrianglesFront.Add(new MorphTriangle { A = 43, B = 22, C = 2 }); TrianglesFront.Add(new MorphTriangle { A = 43, B = 45, C = 2 }); TrianglesFront.Add(new MorphTriangle { A = 47, B = 45, C = 2 }); TrianglesFront.Add(new MorphTriangle { A = 44, B = 22, C = 2 }); TrianglesFront.Add(new MorphTriangle { A = 44, B = 46, C = 2 }); TrianglesFront.Add(new MorphTriangle { A = 46, B = 48, C = 2 }); TrianglesFront.Add(new MorphTriangle { A = 48, B = 49, C = 2 }); TrianglesFront.Add(new MorphTriangle { A = 47, B = 49, C = 2 }); // nose-eyes TrianglesFront.Add(new MorphTriangle { A = 25, B = 22, C = 44 }); TrianglesFront.Add(new MorphTriangle { A = 44, B = 41, C = 31 }); TrianglesFront.Add(new MorphTriangle { A = 24, B = 22, C = 43 }); TrianglesFront.Add(new MorphTriangle { A = 43, B = 38, C = 27 }); // left mouth TrianglesFront.Add(new MorphTriangle { A = 3, B = 52, C = 56 }); TrianglesFront.Add(new MorphTriangle { A = 45, B = 52, C = 56 }); TrianglesFront.Add(new MorphTriangle { A = 45, B = 47, C = 56 }); TrianglesFront.Add(new MorphTriangle { A = 49, B = 47, C = 56 }); TrianglesFront.Add(new MorphTriangle { A = 49, B = 54, C = 56 }); TrianglesFront.Add(new MorphTriangle { A = 3, B = 60, C = 56 }); TrianglesFront.Add(new MorphTriangle { A = 3, B = 60, C = 63 }); TrianglesFront.Add(new MorphTriangle { A = 3, B = 58, C = 63 }); TrianglesFront.Add(new MorphTriangle { A = 64, B = 58, C = 55 }); TrianglesFront.Add(new MorphTriangle { A = 63, B = 61, C = 64 }); TrianglesFront.Add(new MorphTriangle { A = 60, B = 54, C = 61 }); TrianglesFront.Add(new MorphTriangle { A = 60, B = 54, C = 56 }); TrianglesFront.Add(new MorphTriangle { A = 63, B = 64, C = 58 }); TrianglesFront.Add(new MorphTriangle { A = 63, B = 60, C = 61 }); // right mouth TrianglesFront.Add(new MorphTriangle { A = 4, B = 53, C = 57 }); TrianglesFront.Add(new MorphTriangle { A = 46, B = 53, C = 57 }); TrianglesFront.Add(new MorphTriangle { A = 46, B = 48, C = 57 }); TrianglesFront.Add(new MorphTriangle { A = 49, B = 48, C = 57 }); TrianglesFront.Add(new MorphTriangle { A = 49, B = 54, C = 57 }); TrianglesFront.Add(new MorphTriangle { A = 4, B = 62, C = 57 }); TrianglesFront.Add(new MorphTriangle { A = 4, B = 62, C = 65 }); TrianglesFront.Add(new MorphTriangle { A = 4, B = 59, C = 65 }); TrianglesFront.Add(new MorphTriangle { A = 64, B = 59, C = 55 }); TrianglesFront.Add(new MorphTriangle { A = 65, B = 61, C = 64 }); TrianglesFront.Add(new MorphTriangle { A = 62, B = 54, C = 61 }); TrianglesFront.Add(new MorphTriangle { A = 62, B = 54, C = 57 }); TrianglesFront.Add(new MorphTriangle { A = 65, B = 64, C = 59 }); TrianglesFront.Add(new MorphTriangle { A = 65, B = 62, C = 61 }); #endregion #region Triangles right TrianglesRight.Add(new MorphTriangle { A = 5, B = 7, C = 78 }); TrianglesRight.Add(new MorphTriangle { A = 9, B = 7, C = 78 }); TrianglesRight.Add(new MorphTriangle { A = 9, B = 11, C = 78 }); TrianglesRight.Add(new MorphTriangle { A = 11, B = 75, C = 78 }); //TrianglesRight.Add(new MorphTriangle { A = 5, B = 3, C = 68 }); TrianglesRight.Add(new MorphTriangle { A = 5, B = 52, C = 3 }); TrianglesRight.Add(new MorphTriangle { A = 66, B = 12, C = 79 }); TrianglesRight.Add(new MorphTriangle { A = 66, B = 43, C = 45 }); TrianglesRight.Add(new MorphTriangle { A = 66, B = 45, C = 68 }); TrianglesRight.Add(new MorphTriangle { A = 50, B = 45, C = 68 }); TrianglesRight.Add(new MorphTriangle { A = 50, B = 52, C = 68 }); //TrianglesRight.Add(new MorphTriangle { A = 68, B = 52, C = 3 }); TrianglesRight.Add(new MorphTriangle { A = 68, B = 52, C = 5 }); TrianglesRight.Add(new MorphTriangle { A = 5, B = 7, C = 3 }); TrianglesRight.Add(new MorphTriangle { A = 7, B = 63, C = 3 }); TrianglesRight.Add(new MorphTriangle { A = 55, B = 75, C = 11 }); TrianglesRight.Add(new MorphTriangle { A = 55, B = 58, C = 11 }); TrianglesRight.Add(new MorphTriangle { A = 9, B = 58, C = 11 }); TrianglesRight.Add(new MorphTriangle { A = 9, B = 63, C = 7 }); TrianglesRight.Add(new MorphTriangle { A = 63, B = 58, C = 9 }); TrianglesRight.Add(new MorphTriangle { A = 12, B = 79, C = 18 }); TrianglesRight.Add(new MorphTriangle { A = 72, B = 79, C = 18 }); TrianglesRight.Add(new MorphTriangle { A = 72, B = 16, C = 18 }); TrianglesRight.Add(new MorphTriangle { A = 72, B = 16, C = 73 }); TrianglesRight.Add(new MorphTriangle { A = 73, B = 13, C = 16 }); TrianglesRight.Add(new MorphTriangle { A = 73, B = 13, C = 22 }); TrianglesRight.Add(new MorphTriangle { A = 73, B = 2, C = 22 }); TrianglesRight.Add(new MorphTriangle { A = 2, B = 49, C = 47 }); TrianglesRight.Add(new MorphTriangle { A = 2, B = 43, C = 47 }); TrianglesRight.Add(new MorphTriangle { A = 45, B = 43, C = 47 }); TrianglesRight.Add(new MorphTriangle { A = 45, B = 49, C = 47 }); TrianglesRight.Add(new MorphTriangle { A = 50, B = 49, C = 45 }); TrianglesRight.Add(new MorphTriangle { A = 50, B = 52, C = 56 }); TrianglesRight.Add(new MorphTriangle { A = 3, B = 52, C = 56 }); TrianglesRight.Add(new MorphTriangle { A = 2, B = 43, C = 22 }); TrianglesRight.Add(new MorphTriangle { A = 37, B = 43, C = 22 }); TrianglesRight.Add(new MorphTriangle { A = 37, B = 43, C = 66 }); TrianglesRight.Add(new MorphTriangle { A = 37, B = 23, C = 66 }); TrianglesRight.Add(new MorphTriangle { A = 12, B = 23, C = 66 }); TrianglesRight.Add(new MorphTriangle { A = 35, B = 23, C = 12 }); TrianglesRight.Add(new MorphTriangle { A = 35, B = 23, C = 37 }); TrianglesRight.Add(new MorphTriangle { A = 35, B = 22, C = 37 }); TrianglesRight.Add(new MorphTriangle { A = 35, B = 13, C = 12 }); TrianglesRight.Add(new MorphTriangle { A = 35, B = 13, C = 22 }); TrianglesRight.Add(new MorphTriangle { A = 18, B = 13, C = 12 }); TrianglesRight.Add(new MorphTriangle { A = 18, B = 13, C = 16 }); TrianglesRight.Add(new MorphTriangle { A = 49, B = 50, C = 56 }); TrianglesRight.Add(new MorphTriangle { A = 49, B = 61, C = 56 }); TrianglesRight.Add(new MorphTriangle { A = 3, B = 61, C = 56 }); TrianglesRight.Add(new MorphTriangle { A = 3, B = 60, C = 63 }); TrianglesRight.Add(new MorphTriangle { A = 58, B = 64, C = 63 }); TrianglesRight.Add(new MorphTriangle { A = 58, B = 64, C = 55 }); TrianglesRight.Add(new MorphTriangle { A = 49, B = 2, C = 75 }); // сомнительные губищи TrianglesRight.Add(new MorphTriangle { A = 49, B = 61, C = 75 }); TrianglesRight.Add(new MorphTriangle { A = 64, B = 61, C = 75 }); TrianglesRight.Add(new MorphTriangle { A = 64, B = 55, C = 75 }); TrianglesRight.Add(new MorphTriangle { A = 60, B = 61, C = 63 }); TrianglesRight.Add(new MorphTriangle { A = 61, B = 64, C = 63 }); #endregion InitializeMorphin(); }
internal void Reset() { pictureTemplate.Image = null; templateImage = string.Empty; Recognizer = null; }