好久沒有寫部落格了,今天來記錄一下之前寫的 人臉追蹤,這次使用的是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分類器
}
}
}
全站熱搜