|
请问一下我试著用haar的face detection +camshift来实现人脸追蹤
可是就是不成功!是不是有可以告诉我我错在那裹?!谢谢
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- 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 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)
- {
-
-
- using( Image<Bgr, Byte> frame = _capture.QueryFrame())
- {
-
- if (isTrack == false)
- {
- Image<Gray, Byte> gray = frame.Convert<Gray, Byte>();
- gray._EqualizeHist();
- MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(face, 1.1, 10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(40, 40));
- hsv = new Image<Hsv, byte>(gray.Width, gray.Height);
- hsv = gray.Convert<Hsv, byte>();
- hsv._EqualizeHist();
- hue = new Image<Gray, byte>(gray.Width, gray.Height);
- mask = new Image<Gray, byte>(gray.Width, gray.Height);
- backproject = new Image<Gray, byte>(gray.Width, gray.Height);
- //Emgu.CV.CvInvoke.cvInRangeS(hsv, new MCvScalar(0, 30, 10, 0), new MCvScalar(180, 256, 256, 0), mask);
- 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);
-
- foreach (MCvAvgComp f in facesDetected[0])
- {
- Emgu.CV.CvInvoke.cvSetImageROI(hue, f.rect);
- Emgu.CV.CvInvoke.cvSetImageROI(mask, f.rect);
- frame.Draw(f.rect, new Bgr(Color.Red), 2);
- trackwin = f.rect;
-
- }
- img = new IntPtr[1]
- {
- hue
- };
- Emgu.CV.CvInvoke.cvCalcHist(img, hist, false, mask);
- Emgu.CV.CvInvoke.cvResetImageROI(hue);
- Emgu.CV.CvInvoke.cvResetImageROI(mask);
- if (facesDetected[0].Length > 0)
- {
- isTrack = true;
- }
- }
- else
- {
- if (trackwin != null)
- {
- hsv = frame.Convert<Hsv, byte>();
- Emgu.CV.CvInvoke.cvInRangeS(hsv, new MCvScalar(0, 30, 10, 0), new MCvScalar(180, 256, 256, 0), mask);
- Emgu.CV.CvInvoke.cvSplit(hsv, hue, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
- imageBox2.Image = hue;
- imageBox3.Image = mask;
- }
- img = new IntPtr[1]
- {
- hue
- };
- Emgu.CV.CvInvoke.cvCalcBackProject(img, backproject, hist);
- Emgu.CV.CvInvoke.cvAnd(backproject, mask, backproject, IntPtr.Zero);
- if (trackwin.Width == 0) trackwin.Width = 40;
- if (trackwin.Height == 0) trackwin.Height = 40;
- Emgu.CV.CvInvoke.cvCamShift(backproject, trackwin, new MCvTermCriteria(10, 0.5), out trackcomp, out trackbox);
- trackwin = trackcomp.rect;
- //label1.Text = trackcomp.rect.X.ToString();
- frame.Draw(trackwin, new Bgr(Color.Red), 2);
- }
-
-
-
- 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();
-
- }
- 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");
- }
- }
- }
复制代码 |
|