C# 无法从emgucv中的视频检测人脸
我能够从图像中检测人脸,但无法通过使用C#中的Emgucv从视频中检测人脸。在我的解决方案中,视频正在播放,但没有检测人脸 我的代码如下:C# 无法从emgucv中的视频检测人脸,c#,video-processing,emgucv,face-detection,C#,Video Processing,Emgucv,Face Detection,我能够从图像中检测人脸,但无法通过使用C#中的Emgucv从视频中检测人脸。在我的解决方案中,视频正在播放,但没有检测人脸 我的代码如下: namespace Emgucv33Apps { public partial class FormFaceDetection : Form { VideoCapture capture; bool Pause = false; // Image<Bgr, byte> imgInpu
namespace Emgucv33Apps
{
public partial class FormFaceDetection : Form
{
VideoCapture capture;
bool Pause = false;
// Image<Bgr, byte> imgInput;
public FormFaceDetection()
{
InitializeComponent();
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
capture = new VideoCapture(ofd.FileName);
Mat m = new Mat();
capture.Read(m);
pictureBox1.Image = m.Bitmap;
}
}
private void DetectFaceHaar(Image<Bgr, byte> img)
{
try
{
string facePath = Path.GetFullPath(@"../../data/haarcascade_frontalface_default.xml");
string eyePath = Path.GetFullPath(@"../../data/haarcascade_eye.xml");
CascadeClassifier classifierFace = new CascadeClassifier(facePath);
CascadeClassifier classifierEye = new CascadeClassifier(eyePath);
var imgGray = img.Convert<Gray, byte>().Clone();
Rectangle[] faces = classifierFace.DetectMultiScale(imgGray, 1.1, 4);
foreach (var face in faces)
{
img.Draw(face, new Bgr(0, 0, 255), 2);
imgGray.ROI = face;
Rectangle[]eyes= classifierEye.DetectMultiScale(imgGray, 1.1, 4);
foreach (var eye in eyes)
{
var e = eye;
e.X += face.X;
e.Y += face.Y;
img.Draw(e, new Bgr(0, 255, 0), 2);
}
}
pictureBox1.Image = img.Bitmap;
pictureBox2.Image = img.Bitmap;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
private async void pauseToolStripMenuItem_Click(object sender, EventArgs e)
{
if (capture == null)
{
return;
}
try
{
while (true)
{
Mat m = new Mat();
capture.Read(m);
if (!m.IsEmpty)
{
pictureBox1.Image = m.Bitmap;
DetectFaceHaar(m.ToImage<Bgr, byte>());
double fps = capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);
await Task.Delay(1000 / Convert.ToInt32(fps));
}
else
{
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
namespace Emgucv33Apps
{
公共部分类FormFaceDetection:表单
{
视频捕获;
布尔暂停=假;
//图像输入;
public FormFaceDetection()
{
初始化组件();
}
私有void openToolStripMenuItem\u单击(对象发送方,事件参数e)
{
OpenFileDialog ofd=新建OpenFileDialog();
if(ofd.ShowDialog()==DialogResult.OK)
{
捕获=新的视频捕获(ofd.FileName);
Mat m=新Mat();
捕获读取(m);
pictureBox1.Image=m.位图;
}
}
专用空位检测Facehaar(图像img)
{
尝试
{
字符串facePath=Path.GetFullPath(@“../../data/haarcascade_frontalface_default.xml”);
字符串eyePath=Path.GetFullPath(@./../data/haarcascade_eye.xml);
CascadeClassifier classifierFace=新的CascadeClassifier(facePath);
CascadeClassifier ClassifierYe=新的CascadeClassifier(eyePath);
var imgGray=img.Convert().Clone();
矩形[]面=分类器面.DetectMultiScale(imgGray,1.1,4);
foreach(面中的面变量)
{
图像绘制(面,新Bgr(0,0,255),2);
imgGray.ROI=面部;
矩形[]眼=分类器眼检测多尺度(imgGray,1.1,4);
foreach(眼睛中的眼睛)
{
var e=眼睛;
e、 X+=面X;
e、 Y+=面Y;
图像绘制(e,新Bgr(0,255,0),2);
}
}
pictureBox1.Image=img.Bitmap;
pictureBox2.Image=img.Bitmap;
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
}
私有异步void pauseToolStripMenuItem\u单击(对象发送方,事件参数e)
{
如果(捕获==null)
{
返回;
}
尝试
{
while(true)
{
Mat m=新Mat();
捕获读取(m);
如果(!m.IsEmpty)
{
pictureBox1.Image=m.位图;
DetectFaceHaar(m.ToImage());
double fps=capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.fps);
等待任务延迟(1000/转换为32(fps));
}
其他的
{
打破
}
}
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
}
}
提前谢谢 首先,您必须为此过程创建一个事件,您需要获取视频的每一帧并检查每一帧的人脸检测。使用VideoCapture类中的QueryFrame方法,可以将每个帧作为图像进行操作并检测人脸 范例
private VideoCapture m_videoCapture;
public MainWindow()
{
InitializeComponent();
try
{
m_videoCapture = new VideoCapture("controlcam.avi");
Application.Idle += onProcessFrame;
}
catch (NullReferenceException ex)
{
MessageBox.Show(ex.Message);
}
}
private void onProcessFrame(Object sender, EventArgs e)
{
Image<Bgr, Byte> frameImage = m_videoCapture.QueryFrame().ToImage<Bgr, Byte>();
// Call your function or write your code here.
DetectFaceHaar(frameImage);
}
private void DetectFaceHaar(Image<Bgr, byte> img)
{
try
{
string facePath = Path.GetFullPath(@"../../data/haarcascade_frontalface_default.xml");
string eyePath = Path.GetFullPath(@"../../data/haarcascade_eye.xml");
CascadeClassifier classifierFace = new CascadeClassifier(facePath);
CascadeClassifier classifierEye = new CascadeClassifier(eyePath);
var imgGray = img.Convert<Gray, byte>().Clone();
Rectangle[] faces = classifierFace.DetectMultiScale(imgGray, 1.1, 4);
foreach (var face in faces)
{
img.Draw(face, new Bgr(0, 0, 255), 2);
imgGray.ROI = face;
Rectangle[] eyes = classifierEye.DetectMultiScale(imgGray, 1.1, 4);
foreach (var eye in eyes)
{
var e = eye;
e.X += face.X;
e.Y += face.Y;
img.Draw(e, new Bgr(0, 255, 0), 2);
}
}
pictureBox1.Image = img.Bitmap;
pictureBox2.Image = img.Bitmap;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
private VideoCapture m\u VideoCapture;
公共主窗口()
{
初始化组件();
尝试
{
m_videoCapture=新的视频捕获(“controlcam.avi”);
Application.Idle+=onProcessFrame;
}
捕获(NullReferenceException ex)
{
MessageBox.Show(例如Message);
}
}
private void onProcessFrame(对象发送方,事件参数e)
{
Image frameImage=m_videoCapture.QueryFrame().ToImage();
//在此处调用函数或编写代码。
DetectFaceHaar(帧图像);
}
专用空位检测Facehaar(图像img)
{
尝试
{
字符串facePath=Path.GetFullPath(@“../../data/haarcascade_frontalface_default.xml”);
字符串eyePath=Path.GetFullPath(@./../data/haarcascade_eye.xml);
CascadeClassifier classifierFace=新的CascadeClassifier(facePath);
CascadeClassifier ClassifierYe=新的CascadeClassifier(eyePath);
var imgGray=img.Convert().Clone();
矩形[]面=分类器面.DetectMultiScale(imgGray,1.1,4);
foreach(面中的面变量)
{
图像绘制(面,新Bgr(0,0,255),2);
imgGray.ROI=面部;
矩形[]眼=分类器眼检测多尺度(imgGray,1.1,4);
foreach(眼睛中的眼睛)
{
var e=眼睛;
e、 X+=面X;
e、 Y+=面Y;
图像绘制(e,新Bgr(0,255,0),2);
}
}
pictureBox1.Image=img.Bitmap;
pictureBox2.Image=img.Bitmap;
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
}
请描述您的具体问题。你试过调试这个吗?有例外吗?您的算法是否按预期工作?