好久沒有寫部落格了,今天來記錄一下之前寫的 人臉追蹤,這次使用的是EmguCV

EmguCV簡單的來說就是把OpenCv包成.net可以使用的模組,你可以在EmguCV的官方網站下戴到該程式。

好來不多說我們來看看程式吧!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
using System.Threading;

namespace FaceDetection_camshift
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Capture _capture;
        private bool _captureInProgress;
        private HaarCascade face;
        private bool isTrack = false;
        private Image<Gray, byte> hue = null;
        private Image<Gray, byte> mask = null;
        private Image<Gray, byte> backproject = null;
        private Image<Hsv, byte> hsv = null;
        private Image<Gray, Byte> gray = null;
        private IntPtr[] img = null;
        private Rectangle trackwin;
        private MCvConnectedComp trackcomp = new MCvConnectedComp();
        private MCvBox2D trackbox = new MCvBox2D();
 
        private DenseHistogram hist = new DenseHistogram(16, new RangeF(0, 180));
 
        private void ProcessFrame(object sender, EventArgs arg)
        {
 
            Image<Bgr, Byte> frame = _capture.QueryFrame();
 
           if (frame!=null){
               gray = frame.Convert<Gray, Byte>();
               gray._EqualizeHist();
               hue = new Image<Gray, byte>(frame.Width, frame.Height);
               mask = new Image<Gray, byte>(frame.Width, frame.Height);
               backproject = new Image<Gray, byte>(frame.Width, frame.Height);
 
              
           }
 
           hsv = frame.Convert<Hsv, byte>(); //彩色空間轉換從BGR到HSV
           hsv._EqualizeHist();
 
 
 
           Emgu.CV.CvInvoke.cvInRangeS(hsv, new MCvScalar(0, 30, Math.Min(10, 255), 0), new MCvScalar(180, 256, Math.Max(10, 255), 0), mask);
           Emgu.CV.CvInvoke.cvSplit(hsv, hue, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
           if (isTrack == false)
           {
               MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(face, 1.1, 10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(40, 40));
 
               foreach (MCvAvgComp f in facesDetected[0])
               {
                   frame.Draw(f.rect, new Bgr(Color.Red), 2);
 
                  
 
                   Emgu.CV.CvInvoke.cvSetImageROI(hue, f.rect);  // 將選擇區域設置為ROI
                   Emgu.CV.CvInvoke.cvSetImageROI(mask, f.rect);// 將選擇區域設置為ROI
 
                   
 
                   img = new IntPtr[1]
                    {
                        hue
                    };
 
                   Emgu.CV.CvInvoke.cvCalcHist(img, hist, false, mask); //計算直方圖
 
                   Emgu.CV.CvInvoke.cvResetImageROI(hue); //釋放直方圖
                   Emgu.CV.CvInvoke.cvResetImageROI(mask); //釋放直方圖
 
                   trackwin = f.rect;
 
                   isTrack = true;
 
 
 
               }
 
           }
 
           img = new IntPtr[1]
                    {
                        hue
                    };
           if (trackwin.Width == 0) trackwin.Width = 40;
           if (trackwin.Height == 0) trackwin.Height = 40;
           Emgu.CV.CvInvoke.cvCalcBackProject(img, backproject, hist); //使用back project方法
           Emgu.CV.CvInvoke.cvAnd(backproject, mask, backproject, IntPtr.Zero);
           Emgu.CV.CvInvoke.cvCamShift(backproject, trackwin, new MCvTermCriteria(10, 0.5), out trackcomp, out trackbox); //使用camshift
           trackwin = trackcomp.rect;
          
           frame.Draw(trackwin, new Bgr(Color.Red), 2);
           imageBox2.Image = hsv;
           imageBox3.Image = mask;
           imageBox1.Image = frame;
           
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            #region if capture is not created, create it now
            if (_capture == null)
            {
                try
                {
                    _capture = new Capture();
                    _capture.FlipHorizontal = true;
                    
                }
                catch (NullReferenceException excpt)
                {
                    MessageBox.Show(excpt.Message);
                }
            }
            #endregion
            if (_capture != null)
            {
                //pictureBox2.Image = Resource1._01;
                if (_captureInProgress)
                {  //stop the capture
                    Application.Idle -= new EventHandler(ProcessFrame);
                    button1.Text = "Start Capture";
 
 
                }
                else
                {
                    //start the capture
                    button1.Text = "Stop";  
                    Application.Idle += new EventHandler(ProcessFrame);
 
                }
 
                _captureInProgress = !_captureInProgress;
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            face = new HaarCascade("haarcascade_frontalface_alt_tree.xml"); // 戴入haar分類器
        }
    }
}
 
 
 

 

值班女郎  

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 is90057 的頭像
    is90057

    宜蘭瘋狂魔術師

    is90057 發表在 痞客邦 留言(7) 人氣()