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

*****
*****
*****
*****
大大您好 我是用筆電內建的攝影鏡頭 請問有可能是這個原因嗎? 小弟比較不懂問題可能兩光一點請多多包涵
我也是用筆電內建的攝影機 1. 需要 New 的物件未建立 2. 需要參照的物件未參照,或傳回 Nothing 所以那個物件變數只有該物件的型別,而無物件的參照。 並未將物件參考設定為物件的執行個體 (NullReferenceException) 當試圖呼叫參考變數為 null (nothing) 的成員時,就會引發。 最簡單的方法是,檢查為什麼該變數會是 null (nothing)。 利用單步偵錯,下中斷點在你取得該參考變數的位置,然後執行一步,看該參考是否是 null (nothing)。 如果是,就回到前一步,看看可能的原因為何。
test
你好我是第一次接觸影像的部分 想使用你的code做練習 但我不知道您介面部分用到那些的元件 可否說明一下 讓我可以使用您的code做練習 感謝您
imageBox & button
想請問一下多人臉追蹤的話要怎麼判斷
你好,請問一 下,您使用的emgu版本是多少的呢
這已經是多年前的文章了所以我也不記得 我用的是那一個版本了,因為已經很久 沒有用windows所以我也不敢跟你確定 程式碼是否適用新的Emgu。