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>(); }
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; }