Что делает метод cvHaarDetectObjects ()?

пожалуйста, может ли какой-нибудь эксперт объяснить мне, можем ли мы использовать cvHaarDetectObjects() метод определения площадей и получения ширины и высоты? Я нашел код, который использует этот метод для распознавания лиц, но мне нужно знать, могу ли я использовать его для обнаружения прямоугольников.

    String src="src/squiredetection/MY.JPG";
    IplImage grabbedImage = cvLoadImage(src);
    IplImage grayImage    = IplImage.create(grabbedImage.width(),  grabbedImage.height(), IPL_DEPTH_8U, 1);

        cvCvtColor(grabbedImage, grayImage, CV_BGR2GRAY);

        CvSeq faces = cvHaarDetectObjects(grayImage, cascade, storage, 1.1, 3, 0);//*
        for (int i = 0; i < faces.total(); i++) {
            CvRect r = new CvRect(cvGetSeqElem(faces, i));
            cvRectangle(grabbedImage, cvPoint(r.x(), r.y()), cvPoint(r.x()+r.width(), r.y()+r.height()), CvScalar.RED, 1, CV_AA, 0);
         /*   hatPoints[0].x = r.x-r.width/10;    hatPoints[0].y = r.y-r.height/10;
            hatPoints[1].x = r.x+r.width*11/10; hatPoints[1].y = r.y-r.height/10;
            hatPoints[2].x = r.x+r.width/2;     hatPoints[2].y = r.y-r.height/2;*/
          //  cvFillConvexPoly(grabbedImage, hatPoints, hatPoints.length, CvScalar.GREEN, CV_AA, 0);
        }

когда я использую вышеуказанный метод, он выдает следующее исключение

OpenCV Error: Bad argument (Invalid classifier cascade) in unknown function, file C:slaveWinInstallerMegaPacksrcopencvmodulesobjdetectsrchaar.cpp, line 1036
Exception in thread "main" java.lang.RuntimeException: C:slaveWinInstallerMegaPacksrcopencvmodulesobjdetectsrchaar.cpp:1036: error: (-5) Invalid classifier cascade

    at com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects(Native Method)
    at com.googlecode.javacv.cpp.opencv_objdetect.cvHaarDetectObjects(opencv_objdetect.java:243)
    at squiredetection.Test2.main(Test2.java:52 I have put * on this line)

пожалуйста, будьте добры достаточно, чтобы дать простой пример кода для этого.

2 ответов


cvHaarDetectObjects() используется для обнаружения объектов или фигур не только для лиц, это зависит от HaarCascade классификатор.

если вы передадите face haarcascade xml затем он вернет массив граней или также может использовать eye, nose, файл и т. д. В XML HaarCascade. Вы можете сделать также заказ haarcascade xml создавая свои собственные положительные и отрицательные образцы, используя opencv_traincascade.exe

CvSeq faces = cvHaarDetectObjects(grayImage, classifier, storage,
                1.1, 3, CV_HAAR_DO_CANNY_PRUNING);

for (int i = 0; i < faces.total(); i++) {
   // its ok
}

подробно opencv doc

для обнаружения прямоугольник :

есть пример обнаружения прямоугольника в OpenCV, они используют его, чтобы обнаружить квадраты на шахматной доске. Посмотреть squares.c in ..\OpenCV\samples\c \ каталог.

посмотреть этот образец обнаружения шахматной доски в opencv

недопустимый каскад классификатора в неизвестной функции ошибка означает, что классификатор, который вы передали, неправильно отформатирован или что-то отсутствует. Проверьте допустимость XML-файла классификатора.


cvHaarDetectObjects возвращает несколько граней, обнаруженных на изображении. Вы должны объявить массив CvSeq для хранения результата, а не только одного CvSeq.

// There can be more than one face in an image.
// So create a growable sequence of faces.
// Detect the objects and store them in the sequence
CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
                                    1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
                                    cvSize(40, 40) );

приведенный выше код был взят из этого сайта:

http://opencv.willowgarage.com/wiki/FaceDetection