【问题标题】:faceDetection EmguCV人脸检测 EmguCV
【发布时间】:2017-09-13 17:30:23
【问题描述】:

当图片中有 5 个人时,picture.jpg 上的给定绿色矩形出现问题。我正在使用 emguCV v2.2 这是我单击并触发按钮时的代码。

Image InputImg = Image.FromFile(@"C:\img\Picture.jpg"); 
Image<Bgr,byte> ImageFrame = new Image<Bgr,byte>(new Bitmap(InputImg));

Image<Gray, byte> grayframe = ImageFrame.Convert<Gray, byte>();
 var faces =  grayframe.DetectHaarCascade(haar, 1.4, 4,
                                    HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                    new Size(25, 25))[0];
foreach (var face in faces)
            {
                ImageFrame.Draw(face.rect, new Bgr(Color.Green), 3);
            }
CamImageBox.Image = ImageFrame;

我希望它应该返回图片.jpg,每个面上都有绿色矩形。但事实并非如此。我可以知道为什么吗?这里有什么错误吗?

谢谢

【问题讨论】:

  • 你确定 foreach 至少有一个矩形可能没有检测到人脸。
  • 您的代码看起来不错。但是,我建议尝试使用 1.1 而不是 1.4 的缩放因子 - 该值控制每次面部扫描时滑动窗口的缩放程度; 1.1 会使窗口膨胀 10% 而不是 40%
  • 这是 25,25 是系统要检测的大小吗?如果我的图片大小超过不工作? HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,新尺寸(25, 25)
  • 该参数是人脸的最小预期区域(以像素为单位)。您可以将其视为扫描图像的滑动窗口的“起始大小”。因此,当 MinSize 为 25,25 和因子 1.1 时,该过程将以 25x25 像素窗口开始扫描。这将在下一次迭代中增长到 28x28,然后增长到 30x30,依此类推。如果在任何这些尺度上检测到类似人脸的图像(或已针对检测器训练的任何类型的图像),则应将其添加到您的结果中。
  • 您使用哪个级联文件来初始化您的 Haar 检测器?

标签: c# opencv emgucv


【解决方案1】:
 var faces =  grayframe.DetectHaarCascade(haar, 1.4, 4,
                                    HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                    new Size(25, 25))[0];

您正在使用scaleFactors = 1.4minNeighbors = 4, 也许你可以调整这些参数并检查结果(scaleFactors = 1.2?)

为了证明你的haarcascade运行良好,你可以尝试使用网络摄像头捕捉作为你的图片来源吗?

Private void Form1_load(object sender, EventArgs e)
{
    try
    {
        //capture webcam
        Capture grabber = new Capture();
        //test capture frame
        grabber.QueryFrame();
        //trigger event when application is idle
        Application.Idle += new EventHandler(FrameGrabber);
    }
    catch
    {
        MessageBox.Show("Capture fail to start");
    }
}

void FrameGrabber(object sender, EventArgs e)
{
    Image<Bgr,byte> ImageFrame = grabber.QueryFrame().Resize(320,240,Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
    Image<Gray, byte> grayframe = ImageFrame.Convert<Gray, byte>();
    MCvAvgComp[] faces =  grayframe.DetectHaarCascade(haar, 1.4, 4,
                                    HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                    new Size(25, 25))[0];
    foreach (MCvAvgComp face in faces)
    {
        ImageFrame.Draw(face.rect, new Bgr(Color.Green), 3);
    }
    CamImageBox.Image = ImageFrame;
}

顺便说一下,grayframe.DetectHaarCascade 的返回类型是MCvAvgComp[][], 因此,您的面孔类型是MCvAvgComp[]

【讨论】:

    【解决方案2】:

    ScaleFactor 应该是&gt;1.0 but closer to 1,因此您可以使用 1.04 或 1.01 以获得更好的结果,但它会使过程变慢。您可以增加minNeighbours,这样您就可以减少误报。 最后使用maxSize参数来限制检测框的最大尺寸。你可以遵循方法的定义

    public Rectangle[] DetectMultiScale(
        IInputArray image,
        double scaleFactor = 1.1,
        int minNeighbors = 3,
        Size minSize = null,
        Size maxSize = null
    )
    

    【讨论】:

      猜你喜欢
      • 2016-05-25
      • 2011-10-06
      • 2014-04-20
      • 2011-10-13
      • 2019-11-18
      • 2018-10-15
      • 2013-07-30
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多