尝试使用 OpenCV JAVA 检测图像中的人脸时出错

Posted

技术标签:

【中文标题】尝试使用 OpenCV JAVA 检测图像中的人脸时出错【英文标题】:Error trying to detect faces in an image with OpenCV JAVA 【发布时间】:2014-03-07 01:08:51 【问题描述】:

我使用了本教程中的代码:http://opencvlover.blogspot.co.uk/2012/11/face-detection-in-javacv-using-haar.html

已稍作修改以读取不同的图像,并在尝试人脸检测之前显示此图像(第 14 行)。通过这个我可以确认图片加载正确。

错误发生在后面的第 23 行。这是完整的错误代码:

OpenCV Error: Null pointer (Invalid classifier cascade) in cvHaarDetectObjectsForROC,file ..\..\..\..\opencv\modules\objdetect\src\haar.cpp, line 1514 
Exception in thread "main" java.lang.RuntimeException: ..\..\..\..\opencv\modules\objdetect\src\haar.cpp:1514: error: (-27) Invalid classifier cascade in function cvHaarDetectObjectsForROC

at com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects(Native Method)
at com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects(opencv_objdetect.java:238)
at FaceDetection.detect(FaceDetection.java:23)
at FaceDetection.main(FaceDetection.java:15)

这是我的完整程序:

import com.googlecode.javacv.cpp.opencv_core.IplImage;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
import static com.googlecode.javacv.cpp.opencv_objdetect.*;

public class FaceDetection

public static final String XML_FILE = 
        "resources/haarcascade_frontalface_default.xml";

public static void main(String[] args)

    IplImage img = cvLoadImage("pic.jpg");      
    cvShowImage("",img);cvWaitKey(0);
    detect(img);        
   

public static void detect(IplImage src)

    CvHaarClassifierCascade cascade = new 
            CvHaarClassifierCascade(cvLoad(XML_FILE));
    CvMemStorage storage = CvMemStorage.create();
    CvSeq sign = cvHaarDetectObjects(
            src,
            cascade,
            storage,
            1.5,
            3,
            CV_HAAR_DO_CANNY_PRUNING);

    cvClearMemStorage(storage);

    int total_Faces = sign.total();     

    for(int i = 0; i < total_Faces; i++)
        CvRect r = new CvRect(cvGetSeqElem(sign, i));
        cvRectangle (
                src,
                cvPoint(r.x(), r.y()),
                cvPoint(r.width() + r.x(), r.height() + r.y()),
                CvScalar.RED,
                2,
                CV_AA,
                0);

    

    cvShowImage("Result", src);
    cvWaitKey(0);

               

有谁知道是什么导致了这个错误,或者如何解决它?谢谢!

【问题讨论】:

你检查过你是否导入了你的haar分类器吗?听起来像是路径错误。 不,我该如何实现?我已经将openCV库包含在项目中,我需要单独导入部件吗? 我是否只需要检查文件是否存在,将某些内容单独包含到项目中,还是被遗忘的声明? 抱歉回复晚了。请查看我的答案以获取更多详细信息。 【参考方案1】:

解决了!

我在 Google 上搜索了“haarcascade_frontalface_default.xml”,将其下载并粘贴在工作区的我的文件夹中,从 XML 字符串中的文件名中删除 /resources/ 并且它可以工作。

【讨论】:

+1 - 由于您的问题已解决,您应该接受其中一个答案。它有助于将此会话标记为“已解决”,这对其他人非常有帮助。 啊,我的错。我记得我当天去设置它为解决,但它说我必须等待24小时或什么的,我一定是第二天忘记了!【参考方案2】:

恭喜你解决了。但是,要进步和学习,您必须了解哪里出了问题。

由于程序找不到级联分类器而发生错误。我以为你错误地声明了分类器的位置,但事实证明你一开始就没有分类器。您通过下载示例分类器并使用它解决了这个问题。

您不必将分类器放在包含程序的文件夹中。您也可以将其放在其他地方并说明分类器所在的路径。

如果您真的很喜欢物体检测,我还建议您训练自己的 haar 分类器。这将帮助您更好地了解级联分类器的工作原理。

【讨论】:

感谢您的进一步提示。我只是将它用作一个更大的、不相关的软件项目的附带功能,所以我现在不太可能研究自定义级联分类器! 如果你有时间的话,我确实还有一个小问题。我的网络摄像头的面部检测实际上非常糟糕,所以我一直在寻找提高性能的方法,你认为增加图像的亮度/对比度可以帮助它找到面部模式吗? 这可能会有所帮助。您可以阅读这篇文章了解更多信息。他们与更暗和更亮的图像进行了比较:gts.tsc.uvigo.es/AREA/papers/ICPR_2010a.pdf 人脸检测相当糟糕并不意外,正如我所说,人脸分类器很可能是一个样本。也许你可以在网上搜索更多这样或更好的人脸分类器。我自己建立了自己的人脸分类器。 其他因素也是相机分辨率。您当前使用的分辨率是多少?

以上是关于尝试使用 OpenCV JAVA 检测图像中的人脸时出错的主要内容,如果未能解决你的问题,请参考以下文章

请教,jni调用,类型转换.用opencv进行静态人脸检测

opencv for java实现人脸检测

opencv 人脸检测中的xml可以修改吗

计算机视觉·OpenCV使用Haar+Cascade实现人脸检测

如何在 android 中提高 OpenCV 人脸检测性能?

基于QT和OpenCV的人脸检测识别系统