【发布时间】:2019-08-07 11:25:05
【问题描述】:
我正在尝试使用 EmguCV 3.1.0.1 库通过视频捕获实现人脸检测,该库由 WinForms 桌面应用程序中 PC Windows 10 64 位操作系统上的 VS15 的 NuGet 包安装。
我的目标是从摄像机中检测和跟踪人脸并检测微笑,但对于下面的示例,我将仅使用面部 HaarCascade .xml 和 CascadeClassifier。
所以,我使用 DirectShowLib 库为 videoDevice 来自 comboBox1_SelectedIndexChanged SelectedItem:
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.UI;
using DirectShowLib;
HaarCascade xml-s 的路径:
string facePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "dir\\haarcascade_frontalface_default.xml");
计时器:
private void timer1_Tick(object sender, EventArgs e)
{
detectFace();
}
尝试 1:
private void detectFace()
{
CascadeClassifier face = new CascadeClassifier(facePath);
Image<Bgr, Byte> currentframe = null;
Image<Gray, byte> grayFrame = null;
Capture grabber;
grabber = new Capture(videoDevice);
currentframe = grabber.QueryFrame().Resize(500, 320, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
if (currentframe != null)
{
grayFrame = currentframe.Convert<Gray, Byte>();
Rectangle[] faceDetected = face.DetectMultiScale(grayFrame, 1.1, 10, Size.Empty, Size.Empty);
foreach (Rectangle faceFound in faceDetected)
{
currentframe.Draw(faceFound, new Bgr(Color.Red), 2);
}
pictureBox1.Image = currentframe.ToBitmap();
}
}
currentframe = grabber.QueryFrame().Resize(500, 320, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 行说:
错误 CS0234 类型或命名空间名称“INTER”不存在于 命名空间“Emgu.CV.CvEnum”(您是否缺少程序集引用?)
相反,我尝试使用currentframe = grabber.QueryFrame().Resize(500, 320, Emgu.CV.CvEnum.TemplateMatchingType.CcoeffNormed);,与grabber.QueryFrame().MatchTemplate 或grabber.QueryFrame().Retrieve 一起使用,但另一个错误仍然在同一行:
错误 CS1061 'Mat' 不包含定义 “调整大小”并且没有扩展方法“调整大小”接受第一个参数 可以找到“Mat”类型的(您是否缺少 using 指令或 汇编参考?)
我不确定我必须在哪里下载所需的 dll-s(如果它是丢失的原因?)以及我应该将哪些 dll-s 添加到引用中。
尝试 2:
private Capture _capture;
private CascadeClassifier _cascadeClassifier;
private void detectFace()
{
_capture = new Capture(videoDevice);
_cascadeClassifier = new CascadeClassifier(facePath);
using (var imageFrame = _capture.QueryFrame().ToImage())
{
if (imageFrame != null)
{
var grayframe = imageFrame.Convert();
var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.1, 10, Size.Empty);
foreach (var face in faces)
{
imageFrame.Draw(face, new Bgr(Color.Red), 3);
}
}
pictureBox1.Image = imageFrame.ToBitmap();
}
}
线using (var imageFrame = _capture.QueryFrame().ToImage()):
错误 CS0411 无法从用法推断方法“Mat.ToImage(bool)”的类型参数。尝试指定 显式输入参数。
线var grayframe = imageFrame.Convert();:
错误 CS0411 方法“Image.Convert()”的类型参数无法从 用法。尝试明确指定类型参数。
线imageFrame.Draw(face, new Bgr(Color.Red), 3);:
错误 CS1503 参数 2:无法从 'Emgu.CV.Structure.Bgr' 转换 到“TColor”
任何指南、建议或示例都会有所帮助
Michal Nawrocik 编辑回答如下:
方法一:
private void detectFace()
{
CascadeClassifier face = new CascadeClassifier(facePath);
Image<Bgr, Byte> currentframe = null;
Image<Gray, byte> grayFrame = null;
Capture grabber;
grabber = new Capture(videoDevice);
var dstMat = new Mat();
var frame = grabber.QueryFrame();
CvInvoke.Resize(frame, dstMat, new Size(500, 320), interpolation: Emgu.CV.CvEnum.Inter.Cubic);
currentframe = dstMat.ToImage<Bgr, byte>();
if (currentframe != null)
{
grayFrame = currentframe.Convert<Gray, Byte>();
Rectangle[] faceDetected = face.DetectMultiScale(grayFrame, 1.1, 10, Size.Empty, Size.Empty);
foreach (Rectangle faceFound in faceDetected)
{
currentframe.Draw(faceFound, new Bgr(Color.Red), 2);
}
pictureBox1.Image = currentframe.ToBitmap();
}
}
未处理的异常:
在 Emgu.CV.World.dll 中发生 System.AccessViolationException' 附加信息:试图读取或写入受保护的内存。 这通常表明其他内存已损坏
方法二:
private Capture _capture;
private CascadeClassifier _cascadeClassifier;
private void detectFace()
{
_capture = new Capture(videoDevice);
_cascadeClassifier = new CascadeClassifier(facePath);
using (var imageFrame = _capture.QueryFrame().ToImage<Bgr, byte>())
{
if (imageFrame != null)
{
var grayframe = imageFrame.Convert<Gray, byte>();
var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.1, 10, Size.Empty);
foreach (var face in faces)
{
imageFrame.Draw(face, new Bgr(Color.Red), 3);
}
}
pictureBox1.Image = imageFrame.ToBitmap();
}
}
}
例外:
Emgu.CV.Util.CvException' 发生在 Emgu.CV.World.dll 附加 信息:OpenCV:无法识别或不支持的数组类型
【问题讨论】:
标签: c# winforms computer-vision emgucv face-detection