Пример #1
0
        private void DetectFace()
        {
            string facePath;

            try
            {
                // get face detect dataset
                facePath = Path.GetFullPath(@"data/haarcascade_frontalface_default.xml");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }


            CascadeClassifier  classifierFace = new CascadeClassifier(facePath);
            Image <Gray, byte> imgGrayCurr    = CurrImageI.Convert <Gray, byte>().Clone();
            Image <Gray, byte> imgGrayNext    = NextImageI.Convert <Gray, byte>().Clone();

            int minWidthCurr  = (int)(CurrImageI.Width * HAAR_MIN_FACE_FACTOR);
            int minHeightCurr = (int)(CurrImageI.Height * HAAR_MIN_FACE_FACTOR);
            int maxWidthCurr  = (int)(CurrImageI.Width * HAAR_MAX_FACE_FACTOR);
            int maxHeightCurr = (int)(CurrImageI.Height * HAAR_MAX_FACE_FACTOR);

            int minWidthNext   = (int)(NextImageI.Width * HAAR_MIN_FACE_FACTOR);
            int minWHeightNext = (int)(NextImageI.Height * HAAR_MIN_FACE_FACTOR);
            int maxWidthNext   = (int)(NextImageI.Width * HAAR_MAX_FACE_FACTOR);
            int maxHeightNext  = (int)(NextImageI.Height * HAAR_MAX_FACE_FACTOR);

            System.Drawing.Size minSizeCurr = new System.Drawing.Size(minWidthCurr, minHeightCurr);
            System.Drawing.Size maxSizeCurr = new System.Drawing.Size(maxWidthCurr, maxHeightCurr);

            System.Drawing.Size minSizeNext = new System.Drawing.Size(minWidthNext, minWHeightNext);
            System.Drawing.Size maxSizeNext = new System.Drawing.Size(maxWidthNext, maxHeightNext);


            // Detect Faces
            facesArrCurr = classifierFace.DetectMultiScale(imgGrayCurr, HAAR_SCALE_FACTOR, HAAR_SCALE_MIN_NEIGHBOURS, minSizeCurr, maxSizeCurr);
            facesArrNext = classifierFace.DetectMultiScale(imgGrayNext, HAAR_SCALE_FACTOR, HAAR_SCALE_MIN_NEIGHBOURS, minSizeNext, maxSizeNext);

            FacesListCurr = facesArrCurr.ToList <Rectangle>();
            FacesListNext = facesArrNext.ToList <Rectangle>();
        }
Пример #2
0
        private void ResizeImage2(System.Drawing.Size sizeOfImage)
        {
            double resizeFactor = 0.4;

            if (facesArrCurr.Length > 0 && facesArrNext.Length > 0)
            {
                Rectangle rectCurr = facesArrCurr[0]; // todo: change
                int       widthC   = rectCurr.Width;
                widthC = (int)(widthC * resizeFactor);
                int heightC = rectCurr.Height;
                heightC = (int)(heightC * resizeFactor);
                rectCurr.Inflate(widthC, heightC);
                CurrImageI.ROI = rectCurr;

                Rectangle rectNext = facesArrNext[0];
                int       widthN   = rectNext.Width;
                widthN = (int)(widthN * resizeFactor);
                int heightN = rectNext.Height;
                heightN = (int)(heightN * resizeFactor);
                rectNext.Inflate(widthN, heightN);
                NextImageI.ROI = rectNext;
            }



            // --------------------------------------

            // resize image: todo -> do while morphing, not during face detect step (maybe)
            System.Drawing.Size currImageSize = new System.Drawing.Size(CurrImageI.Width, CurrImageI.Height);
            System.Drawing.Size nextImageSize = new System.Drawing.Size(NextImageI.Width, NextImageI.Height);

            // downscale to 1080p
            if (currImageSize.Height > 1080 || currImageSize.Width > 1920)
            {
                var tmp = CurrImageI.Mat;
                currImageMat = GetSquareImage(tmp, 1920);
                CurrImageI   = currImageMat.ToImage <Bgr, byte>();
            }

            if (nextImageSize.Height > 1080 || nextImageSize.Width > 1920)
            {
                var tmp = NextImageI.Mat;
                nextImageMat = GetSquareImage(tmp, 1920);
                NextImageI   = nextImageMat.ToImage <Bgr, byte>();
            }


            if (currImageSize.Height > nextImageSize.Height || currImageSize.Width > nextImageSize.Width)
            {
                var tmp = CurrImageI.Mat;
                currImageMat = GetSquareImage(tmp, NextImageI.Width);
                CurrImageI   = currImageMat.ToImage <Bgr, byte>();
            }
            else
            {
                var tmp = NextImageI.Mat;
                nextImageMat = GetSquareImage(tmp, CurrImageI.Width);
                NextImageI   = nextImageMat.ToImage <Bgr, byte>();
            }

            // -> resize
            CurrImageI = CurrImageI.Resize(sizeOfImage.Width, sizeOfImage.Height, Emgu.CV.CvEnum.Inter.Linear);
            NextImageI = NextImageI.Resize(sizeOfImage.Width, sizeOfImage.Height, Emgu.CV.CvEnum.Inter.Linear);

            this.curr.ResizedImage = CurrImageI;
            this.next.ResizedImage = NextImageI;
        }