2012年7月3日 星期二

emgu WPF facedetection

To combine WPF,cameraCapture and faceDetection
1. WPF example (Key function)
public static BitmapSource ToBitmapSource(IImage image)
2. CameraCapture acquires images in windowform control, it may be converted into WPF image by the previous method.
3. Get the image and detect face and eyes, passing it into WPF image.
    Notes: Add System.Drawing for some of items such as Size ==> System.Drawing.Size,
               Color -> System.Drawing.Color ... etc.

    public Window1()
        {
            InitializeComponent();
            this.Dispatcher.Hooks.DispatcherInactive += new EventHandler(ProcessFrame);
            _capture = new Capture();
        }

        private Capture _capture;
        private bool _captureInProgress;
        private void ProcessFrame(object sender, EventArgs arg)
        {
            Image<Bgr, Byte> frame = _capture.QueryFrame();
            Image<Gray, Byte> gray = frame.Convert<Gray, Byte>(); //Convert it to Grayscale

            //Stopwatch watch = Stopwatch.StartNew();
            this.Dispatcher.Hooks.DispatcherInactive -= new EventHandler(ProcessFrame);
            //normalizes brightness and increases contrast of the image
            gray._EqualizeHist();

            //Read the HaarCascade objects

            HaarCascade face = new HaarCascade("haarcascade_frontalface_alt_tree.xml");
            HaarCascade eye = new HaarCascade("haarcascade_eye.xml");

            //Detect the faces  from the gray scale image and store the locations as rectangle
            //The first dimensional is the channel
            //The second dimension is the index of the rectangle in the specific channel
            MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
               face,
               1.1,
               10,
               Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
               new System.Drawing.Size(20, 20));

            foreach (MCvAvgComp f in facesDetected[0])
            {
                //draw the face detected in the 0th (gray) channel with blue color
                //image.Draw(f.rect, new Bgr(Color.Blue), 2);
                frame.Draw(f.rect, new Bgr(System.Drawing.Color.Blue), 2);

                //Set the region of interest on the faces
                gray.ROI = f.rect;
                MCvAvgComp[][] eyesDetected = gray.DetectHaarCascade(
                   eye,
                   1.1,
                   10,
                   Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                   new System.Drawing.Size(20, 20));
                gray.ROI = System.Drawing.Rectangle.Empty;

                foreach (MCvAvgComp e in eyesDetected[0])
                {
                    System.Drawing.Rectangle eyeRect = e.rect;
                    eyeRect.Offset(f.rect.X, f.rect.Y);
                    frame.Draw(eyeRect, new Bgr(System.Drawing.Color.Red), 2);
                }
            }

            image1.Source = ToBitmapSource(frame);
            this.Dispatcher.Hooks.DispatcherInactive += new EventHandler(ProcessFrame);
        }
4. 下載

沒有留言:

張貼留言