Ошибка при попытке определить лица на изображении с помощью OpenCV JAVA

Я использовал код из этого урока: 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);

    }           
}

Кто-нибудь знает, что вызывает эту ошибку, или как ее можно исправить? Спасибо!

2 ответа

Решение

Решено!

Я погуглил "haarcascade_frontalface_default.xml", скачал и вставил в свою папку в рабочей области, взял /resources/ off из имени файла в строке XML, и это работает.

Поздравляю с решением. Однако, чтобы прогрессировать и учиться, вы должны понимать, что пошло не так.

Произошла ошибка, поскольку программа не может найти каскадный классификатор. Я думал, что вы неправильно указали местоположение классификатора, но оказалось, что у вас вообще не было классификатора. Вы решили это, загрузив пример классификатора и используя его.

Вам не обязательно помещать классификатор в папку, содержащую программу. Вы также можете поместить его в другое место и указать путь к месту расположения классификатора.

Я бы также порекомендовал вам обучить свой собственный классификатор haar, если вы действительно занимаетесь обнаружением объектов. Это поможет вам лучше понять, как работает каскадный классификатор.

Другие вопросы по тегам