我安装了OpenCV 2.4.8 Java API,以使用tutorial中提供的面部检测示例。
在示例中,lbpcascade_frontalface.xml
- 这是CascadeClassifier
- 可以正常检测他们提供的女性面部图像(lena.png
)。但是,当我在网上对此随机image进行尝试时,分类器生成了以下图像,缺少4个明显的(!)面:
我很失望,因为我预计这个(有清晰的对比)是一个非常容易检测面部的图像。
1)用Java编码,是否可以改进此分类器来检测此图片中的所有面孔?或者我需要C ++吗?
2)我看了OpenCV's CascadeClassification
web page,看到有可能训练自己的分类器。但是说明是用C ++编写的。有没有人用Java做过这个或者只能在C ++中做到这一点?
答案 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。然后将检测到所有面部。
以下是结果:,更多详情请参阅:http://www.pkuaas.org/?uid-1140-action-viewspace-itemid-3224
答案 2 :(得分:1)
我保存了你的图像,这个c ++代码找到了缺失的4个面以及所有其他面(注意不同的Haar级联和最小尺寸):
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();