OpenCV 2.4.8人脸检测性能不佳

时间:2014-02-17 15:22:02

标签: java c++ opencv face-detection

我安装了OpenCV 2.4.8 Java API,以使用tutorial中提供的面部检测示例。

在示例中,lbpcascade_frontalface.xml - 这是CascadeClassifier - 可以正常检测他们提供的女性面部图像(lena.png)。但是,当我在网上对此随机image进行尝试时,分类器生成了以下图像,缺少4个明显的(!)面:

enter image description here

我很失望,因为我预计这个(有清晰的对比)是一个非常容易检测面部的图像。

1)用Java编码,是否可以改进此分类器来检测此图片中的所有面孔?或者我需要C ++吗?

2)我看了OpenCV's CascadeClassification web page,看到有可能训练自己的分类器。但是说明是用C ++编写的。有没有人用Java做过这个或者只能在C ++中做到这一点?

3 个答案:

答案 0 :(得分:3)

培训与任何编程语言无关。

http://docs.opencv.org/doc/user_guide/ug_traincascade.html

您只需要使用opencv库中包含的两个已编写的程序:创建样本 traincascade 。您也可以使用Haar和LBP功能,但Haar功能在面部检测方面略胜一筹。 (顺便说一下:不要使用 haartraining )。

答案 1 :(得分:1)

这是因为教程选择使用的faceDetector是lbpcascade_frontalface.xml,这是不够好的,至少无法检测到你使用的图片中的所有面部。

您可以在opencv-2.4.8 \ sources \ data \ haarcascades文件夹下更改为使用haarcascade_frontalface_alt.xml。然后将检测到所有面部。

以下是结果:enter image description here,更多详情请参阅:http://www.pkuaas.org/?uid-1140-action-viewspace-itemid-3224

答案 2 :(得分:1)

我保存了你的图像,这个c ++代码找到了缺失的4个面以及所有其他面(注意不同的Haar级联和最小尺寸):enter image description here

    Mat im1 = imread("JuVIA.png", CV_LOAD_IMAGE_COLOR);

    vector<Rect> faces;
    CascadeClassifier cascade( "C:/local/opencv249/sources/data/haarcascades/haarcascade_frontalface_alt2.xml" );
    cascade.detectMultiScale( im1, faces, 1.1, 2, 0| CV_HAAR_SCALE_IMAGE, Size(30, 30) );

    for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++ )
        cv::rectangle( im1, *r, CV_RGB(255,0,0) );

    imshow("in", im1);
    imwrite( "miss4.png", im1);
    waitKey();