2017-05-09 98 views
0

我建立在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(); 
      } 
     } 
    } 
} 

回答

0

正如經常出現堆棧溢出,我發現了一個(部分)解決了這個幾秒鐘張貼的問題後。

什麼似乎是造成該問題的條件聲明if (nextFrame != null)。我不知道這是否與我的攝像頭的刷新率或timer1計時器有關。現在刪除它可以檢測到人臉,但是我需要充分利用DetectMultiScale方法的參數,因爲只有在完全正面和非常接近的情況下才能檢測到它們。

如果有人能進一步闡明這一點,請成爲我的客人;然而,它是有效的,這對我來說很重要。如果您來這裏是爲了使用Emgu.CV 3.1進行人臉檢測的示例,請嘗試使用上面的代碼,而不使用該條件語句。