//static void RunDetection(string filename, Rect rect, Point leftEye, Point rightEye, ref byte [] facePix, Rect faceRect) static void RunDetection(string filename, Rect rect, FaceDisp.FaceData faceData, ref byte [] facePix, Rect faceRect) { EyeDetect eyeDetect = new EyeDetect(); int byteCountPerPix = (int)(facePix.Length / faceRect.Width / faceRect.Height); bool isSuccess = eyeDetect.SetAlgorithm(_algo, _algoData); if (true == isSuccess) { EyeDetectResult eyeResult = eyeDetect.Detect(facePix, (int)_faceDisplayWidth, (int)_faceDisplayWidth); _outStream.WriteLine("{0}", filename); _outStream.Write("{0} {1} {2} {3} ", (int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height); if (faceData.TrueLeftEye.X > 1.0) { Point leftEye = FaceFeatureToScaledPoint(faceData.TrueLeftEye, rect); Point rightEye = FaceFeatureToScaledPoint(faceData.TrueRightEye, rect); _outStream.Write("{0:F3} {1:F3} {2:F3} {3:F3} ", leftEye.X, leftEye.Y, rightEye.X, rightEye.Y); } else { _outStream.Write("{0:F3} {1:F3} {2:F3} {3:F3} ", faceData.TrueLeftEye.X, faceData.TrueLeftEye.Y, faceData.TrueRightEye.X, faceData.TrueRightEye.Y); } _outStream.Write("{0:F3} {1:F3} {2:F3} {3:F3} ", eyeResult.LeftEye.X / _faceDisplayWidth, eyeResult.LeftEye.Y / _faceDisplayWidth, eyeResult.RightEye.X / _faceDisplayWidth, eyeResult.RightEye.Y / _faceDisplayWidth); FaceFeatureResult res = eyeResult as FaceFeatureResult; if (null != res) { if (faceData.Nose.X > 1.0) { Point nose = FaceFeatureToScaledPoint(faceData.Nose, rect); Point leftMouth = FaceFeatureToScaledPoint(faceData.LeftMouth, rect); Point rightMouth = FaceFeatureToScaledPoint(faceData.RightMouth, rect); _outStream.Write("{0:F3} {1:F3} ", nose.X, nose.Y); _outStream.Write("{0:F3} {1:F3} {2:F3} {3:F3} ", leftMouth.X, leftMouth.Y, rightMouth.X, rightMouth.Y); } else { _outStream.Write("{0:F3} {1:F3} ", faceData.Nose.X, faceData.Nose.Y); _outStream.Write("{0:F3} {1:F3} {2:F3} {3:F3} ", faceData.LeftMouth.X, faceData.LeftMouth.Y, faceData.RightMouth.X, faceData.RightMouth.Y); } _outStream.Write("{0:F3} {1:F3} ", res.Nose.X / _faceDisplayWidth, res.Nose.Y / _faceDisplayWidth); _outStream.Write("{0:F3} {1:F3} {2:F3} {3:F3} ", res.LeftMouth.X / _faceDisplayWidth, res.LeftMouth.Y / _faceDisplayWidth, res.RightMouth.X / _faceDisplayWidth, res.RightMouth.Y / _faceDisplayWidth); } if (_maxTransformCount > 0) { _outStream.Write("{0:F3} {1:F3} {2:F3}", _transform.Theta, _transform.X, _transform.Y); } _outStream.WriteLine(); } else { _outStream.WriteLine("Detection failed on {0}", filename); } }
public void SetFaceFeatureFile(string file) { if (false == eyeDetect.SetAlgorithm(EyeDetect.AlgorithmEnum.NN, file)) { throw new Exception("Could not load detector file " + file); } }
private void detectorFileToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "bin files (*.bin)|*.bin|All files (*.*)|*.*"; if (DialogResult.OK == dialog.ShowDialog()) { if (false == eyeDetect.SetAlgorithm(EyeDetect.AlgorithmEnum.NN, dialog.FileName)) { MessageBox.Show("Could not load detectoir file " + Path.GetFileName(dialog.FileName)); } } }
/// <summary> /// Initialize a photo by displaying detected faces /// </summary> /// <param name="mainCanvas">Main canvas reference</param> /// <param name="filename">Full path name to image file</param> /// <param name="faceRectList">Detected location of faces</param> /// <param name="borderWidth">Border width to use around faces</param> /// <param name="faceIdList">Id's to use for each detected face </param> /// <returns>Number of faces displayed</returns> private int InitializeInternal(BackgroundCanvas mainCanvas, string filename, List <Rect> faceRectList, int borderWidth, List <int> faceIdList) { _faceRectList = faceRectList; _mainCanvas = mainCanvas; _pathName = filename; _fileName = System.IO.Path.GetFileName(_pathName); Dpu.ImageProcessing.Image[] dataPixs = CreateMainBitMap(filename); _border = new Border(); RenderTransform = new ScaleTransform(1.0, 1.0);; _childImage = new Image(); _childImage.Source = _bitmap; _border.Child = _childImage; _border.BorderThickness = new Thickness(borderWidth); _border.BorderBrush = Brushes.Black; _border.Background = Brushes.White; Children.Add(_border); double xScale = _bitmap.PixelWidth / _originalRect.Width; double yScale = _bitmap.PixelHeight / _originalRect.Height; bool doEyeDetect = false; EyeDetect eyeDetect = null; Rect displayFaceRect = new Rect(0, 0, _faceDisplayWidth, _faceDisplayWidth); Rect eyeDetectFaceRect = displayFaceRect; if (_leftEyeList == null) { doEyeDetect = true; eyeDetect = new EyeDetect(); eyeDetect.SetAlgorithm(_mainCanvas.OptionDialog.EyeDetectAlgo, _mainCanvas.OptionDialog.EyeDetectPathName); if (_mainCanvas.OptionDialog.EyeDetectAlgo == EyeDetect.AlgorithmEnum.NN) { eyeDetectFaceRect = new Rect(0, 0, 41, 41); } } _outlineRectList = new List <Rectangle>(); _faceList = new List <Face>(); for (int iRect = 0; iRect < faceRectList.Count; ++iRect) { Rectangle outlineRect = new Rectangle(); Rect rect = faceRectList[iRect]; outlineRect.Width = rect.Width * xScale; outlineRect.Height = rect.Height * yScale; SetLeft(outlineRect, rect.X * xScale + _border.BorderThickness.Left); SetTop(outlineRect, rect.Y * yScale + _border.BorderThickness.Top); outlineRect.Stroke = Brushes.Blue; outlineRect.Visibility = Visibility.Visible; outlineRect.Opacity = 1.0; Children.Add(outlineRect); Image faceImage = new Image(); Point targetLeft = new Point(0, 0); Point targetRight = new Point(0, _faceDisplayWidth); BitmapSource newbitMap = SelectAndNormalizeBitmap(dataPixs, new Point(rect.X, rect.Y), new Point(rect.X + rect.Width, rect.Y), new Point(0, 0), new Point(_faceDisplayWidth, 0), displayFaceRect); int eyeId = FindEyes(_leftEyeList, _rightEyeList, rect); Point leftEye = new Point(0, 0); Point rightEye = new Point(0, 0); if (eyeId >= 0) { leftEye = _leftEyeList[eyeId]; rightEye = _rightEyeList[eyeId]; } else if (doEyeDetect == true) { byte[] faceEyeDetect; int faceDetectPixCount = (int)(eyeDetectFaceRect.Width * eyeDetectFaceRect.Height); faceEyeDetect = SelectAndNormalizePatch(dataPixs, new Point(rect.X, rect.Y), new Point(rect.X + rect.Width, rect.Y), new Point(0, 0), new Point(eyeDetectFaceRect.Width, 0), eyeDetectFaceRect); faceEyeDetect = ConvertToGreyScale(faceEyeDetect, faceEyeDetect.Length / faceDetectPixCount); EyeDetectResult eyeResult = eyeDetect.Detect(faceEyeDetect, (int)eyeDetectFaceRect.Width, (int)eyeDetectFaceRect.Height); leftEye.X = eyeResult.LeftEye.X * rect.Width / eyeDetectFaceRect.Width + rect.X; leftEye.Y = eyeResult.LeftEye.Y * rect.Height / eyeDetectFaceRect.Height + rect.Y; rightEye.X = eyeResult.RightEye.X * rect.Width / eyeDetectFaceRect.Width + rect.X; rightEye.Y = eyeResult.RightEye.Y * rect.Height / eyeDetectFaceRect.Height + rect.Y; } // else This is case where eye list is supplied an dthis face was not found - do not add this face BitmapSource normBitMap = SelectAndNormalizeBitmap(dataPixs, leftEye, rightEye, _mainCanvas.OptionDialog.NormalizeLeftEyeLocation, _mainCanvas.OptionDialog.NormalizeRightEyeLocation, displayFaceRect); if (null != newbitMap && null != normBitMap) { int faceID; if (null != faceIdList && iRect < faceIdList.Count) { faceID = faceIdList[iRect]; } else { faceID = mainCanvas.CreateNewObjectID(); } Face face = new Face(mainCanvas, filename, faceID, normBitMap, newbitMap, iRect, this); if (null != normBitMap) { leftEye.X = (leftEye.X - rect.X) * _faceDisplayWidth / rect.Width; leftEye.Y = (leftEye.Y - rect.Y) * _faceDisplayWidth / rect.Height; rightEye.X = (rightEye.X - rect.X) * _faceDisplayWidth / rect.Width; rightEye.Y = (rightEye.Y - rect.Y) * _faceDisplayWidth / rect.Height; face.LeftEye = leftEye; face.RightEye = rightEye; } mainCanvas.AddFace(face); _faceList.Add(face); _outlineRectList.Add(outlineRect); } else { //Face is is not used remove the rect _faceList.Add(null); } } MakeInvisible(); return(_outlineRectList.Count); }