我建立在C#中測試應用程序從一個攝像頭檢測臉部,並使用Emgu.CV偵測臉部從網絡攝像頭(C#)
我已經建立了它作爲一個帶有計時器的Windows窗體(timer1
) ,一個用於顯示網絡攝像頭輸出的圖片框(pictureBox1
)和一個用於顯示臉部數量的文本框(textBox2
)。我已經通過NuGet(v3.1.0.1)安裝了EmguCV並設置了一切。 EmguCV的大多數教程都是針對早期版本的,並且必要的HaarCascade
類已折舊。但是,this Stack Overflow question爲我提供了對我的代碼的必要更新。
我現在已經設置了一切工作。網絡攝像機在pictureBox1
中顯示更新圖像。檢測器假定在每次timer1
滴答結束時在網絡攝像機幀上工作,並且Faces[]
陣列中的矩形數作爲字符串輸出到textBox2
。然而,似乎沒有任何工作。我無法識別任何東西。該程序正在運行,但檢測到的人臉數量始終爲0.如果我最初將NumberOfFaces
變量設置爲5之類的值,則Emgu代碼會將其更改爲0。所以,事情正在發生。我正在使用EmguCV提供的haar xml,但無濟於事。有誰能夠幫助我?
代碼如下轉儲:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.CvEnum;
namespace FaceDetectTest
{
public partial class Form1 : Form
{
public Capture cap;
public CascadeClassifier haar;
public int NumberOfFaces;
public Rectangle[] Faces;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
cap = new Emgu.CV.Capture(0);
haar = new CascadeClassifier(@"C:\Users\Rob\AppData\Roaming\masterbeast\haarcascade_frontalface_alt_tree.xml");
NumberOfFaces = 0;
}
private void timer1_Tick_1(object sender, EventArgs e)
{
using (Image<Bgr, byte> nextFrame = cap.QueryFrame().ToImage<Bgr, Byte>())
{
if (nextFrame != null)
{
Image<Gray, byte> grayframe = nextFrame.Convert<Gray, byte>();
Faces = haar.DetectMultiScale(grayframe, 1.1, 1, new Size(100, 100), new Size(1000, 1000));
NumberOfFaces = Faces.Length;
}
pictureBox1.Image = nextFrame.ToBitmap();
textBox2.Text = NumberOfFaces.ToString();
}
}
}
}