예제 #1
0
        public static void InitializeFaceAgeImage(string path)
        {
            var fcr = new LuxandFaceRecognition();

            fcr.Recognize(ref path, false, true);
            Recognizer = fcr;
        }
예제 #2
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...");
                }
            }
        }
예제 #3
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;
            }
        }