Грешка при опит за откриване на лица в изображение с 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
проверихте ли дали вече сте импортирали своя хаар-класификатор? Звучи като грешка в пътя.   -  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)


Решено!

Потърсих в Google „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

Поздравления за решаването му. Но за да напредвате и да се учите, трябва да разберете какво се е объркало.

Възникна грешка, защото програмата не може да намери каскадния класификатор. Мислех, че сте декларирали местоположението на класификатора погрешно, но се оказа, че не сте имали класификатора на първо място. Решихте това, като изтеглихте примерен класификатор и го използвате.

Не е задължително да поставяте класификатора в папката, съдържаща програмата. Можете също да го поставите някъде другаде и да посочите пътя до мястото, където се намира класификаторът.

Също така бих ви препоръчал да обучите свой собствен хаар-класификатор, ако наистина обичате откриването на обекти. Това ще ви помогне да разберете по-добре как работи каскадният класификатор.

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