2

我使用了本教程中的代码: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);

    }           
}

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

4

2 回答 2

2

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

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

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

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

于 2014-02-11T04:19:59.823 回答
2

解决了!

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

于 2014-02-10T18:22:30.487 回答