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