Ошибка при попытке обнаружить лица на изображении с помощью 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);

    }           
}

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


person dahui    schedule 09.02.2014    source источник
comment
Вы уже проверили, импортировали ли вы свой классификатор haar? Похоже на ошибку пути.   -  person rockinfresh    schedule 10.02.2014
comment
Нет, как мне этого добиться? У меня есть библиотека openCV, включенная в проект, мне нужно будет импортировать части отдельно?   -  person dahui    schedule 10.02.2014
comment
Нужно просто проверить наличие файла, включить что-то отдельно в проект или это забытая декларация?   -  person dahui    schedule 10.02.2014
comment
Извините за поздний ответ. Пожалуйста, просмотрите мой ответ для более подробной информации.   -  person rockinfresh    schedule 11.02.2014


Ответы (2)


Решено!

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

person dahui    schedule 10.02.2014
comment
+1 - Поскольку ваша проблема решена, вы должны принять один из ответов. Это помогает пометить эту сессию как «решенную», что действительно полезно для других. - person Abid Rahman K; 20.05.2014
comment
Ах да, мой плохой. Я помню, я пошел, чтобы установить его как решенный в тот же день, но он сказал, что мне нужно подождать 24 часа или что-то в этом роде, я, должно быть, забыл на следующий день! - person dahui; 21.05.2014

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

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

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

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

person rockinfresh    schedule 11.02.2014
comment
Спасибо за дополнительные советы. Я использую это только как побочную функцию более крупного, не связанного с этим проекта программного обеспечения, поэтому маловероятно, что сейчас я буду изучать пользовательские каскадные классификаторы! - person dahui; 11.02.2014
comment
У меня действительно есть еще один мини-вопрос, если у вас есть время. Распознавание лиц на моей веб-камере на самом деле довольно ужасное, поэтому я искал способы повысить производительность. Как вы думаете, может ли увеличение яркости/контрастности изображения помочь ей найти рисунок лица? - person dahui; 11.02.2014
comment
Это может немного помочь. Вы можете прочитать эту статью для получения дополнительной информации. Они провели сравнение с более темными и более яркими изображениями: gts.tsc.uvigo .es/AREA/papers/ICPR_2010a.pdf - person rockinfresh; 11.02.2014
comment
обнаружение лиц довольно ужасное не является неожиданным, как я уже сказал, классификатор лиц, вероятно, будет образцом. Может быть, вы можете поискать в Интернете больше таких или лучший классификатор лиц. Я сам построил свой собственный классификатор лиц. - person rockinfresh; 11.02.2014
comment
Еще одним фактором может быть разрешение камеры. Какое текущее разрешение вы используете? - person rockinfresh; 11.02.2014
comment
Я не уверен, встроенный стандарт для Toshiba Satellite L775, не особенно хороший, но и не ужасный, я поищу другие классификаторы и протестирую их, спасибо - person dahui; 11.02.2014