Пример #1
0
        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;
        }
Пример #2
0
        public static void InitializeFaceAgeImage(string path)
        {
            var fcr = new LuxandFaceRecognition();

            fcr.Recognize(ref path, false, true);
            Recognizer = fcr;
        }
Пример #3
0
        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...");
                }
            }
        }
Пример #4
0
        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;
            }
        }
Пример #5
0
        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]);
        }
Пример #6
0
        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();
        }
Пример #7
0
 internal void Reset()
 {
     pictureTemplate.Image = null;
     templateImage         = string.Empty;
     Recognizer            = null;
 }