2017-05-09 1 views
0

Ich baue eine Testanwendung in C# Gesichter von einer Webcam zu erkennen undEmgu.CV verwenden Um Faces Von Webcam (C#) zu Detect

ich es als Windows Form mit einem Timer gebaut haben (timer1) , ein Bildfeld zur Anzeige der Webcam-Ausgabe (pictureBox1) und ein Textfeld zur Anzeige der Anzahl der Gesichter (textBox2). Ich habe EmguCV über NuGet (v3.1.0.1) installiert und alles eingerichtet. Die meisten Tutorials für EmguCV sind für eine frühere Version und die erforderliche HaarCascade Klasse wurde abgeschrieben. Allerdings hat mir this Stack Overflow question die notwendigen Updates für meinen Code zur Verfügung gestellt.

Ich habe jetzt alles eingerichtet, um zu arbeiten. Die Webcam zeigt ein aktualisierendes Bild in pictureBox1. Der Detektor ist angenommen zu arbeiten auf der Webcam Frames jedes Mal timer1 Ticks über, und die Anzahl der Rechtecke in der Faces[] Array wird als eine Zeichenfolge an textBox2 ausgegeben. Nichts scheint jedoch zu funktionieren. Ich kann nichts erkennen. Das Programm wird ausgeführt, aber die Anzahl der erkannten Gesichter lautet immer 0. Wenn ich die Variable NumberOfFaces anfangs auf 5 setze, ändert der Emgu-Code die Ausgabe in 0. Also passiert etwas. Ich verwende das mit EmguCV mitgelieferte Haar-XML, aber ohne Erfolg. Kann mir jemand helfen?

-Code unten Dump:

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(); 
      } 
     } 
    } 
} 

Antwort

0

Wie so oft bei Stack-Überlauf, fand ich eine (Teil-) Lösung für diese einige Sekunden nach der Frage der Veröffentlichung.

Was das Problem zu verursachen schien, war die bedingte Anweisung if (nextFrame != null). Ich weiß nicht, ob das mit der Aktualisierungsrate meiner Webcam oder dem timer1 Tickover zu tun hat. Das Entfernen dieser erkennt nun Gesichter, obwohl ich mit den Parametern der DetectMultiScale Methode herumspielen muss, da sie nur erkannt werden, wenn sie vollständig frontal und sehr nah sind.

Wenn jemand weiter Licht darauf werfen kann, bitte seien Sie mein Gast; Aber es funktioniert, und das ist alles, was mir wichtig ist. Wenn Sie hier ein Beispiel für die Verwendung von Emgu.CV 3.1 für die Gesichtserkennung verwenden, versuchen Sie den obigen Code ohne diese bedingte Anweisung.