人脸检测Emgu CV

时间:2013-01-02 15:08:28

标签: c# opencv emgucv

我在picture.jpg的给定绿色矩形上遇到问题,那里有5个人的照片。我正在使用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;

我预计它应该给我返回picture.jpg,每张脸上都有绿色矩形。但事实并非如此。我可以知道为什么吗?这里有什么错误吗?

由于

2 个答案:

答案 0 :(得分: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[]

答案 1 :(得分:0)

$rootScope.$on('someevent', function(event, passed_obj) { console.log('received event'); console.log(passed_obj); $scope.countryfilter = passed_obj.value; }); 应为ScaleFactor,因此您可以使用1.04或1.01来获得更好的结果,但这会使流程变慢。你可以增加>1.0 but closer to 1,这样你就可以减少假阳性。 最后使用minNeighbours参数来限制检测到的框的最大大小。你可以按照方法的定义

maxSize