cvHaarDetectObjects()方法有什么作用?

时间:2012-06-26 12:59:35

标签: java image-processing opencv javacv

请一位专家解释一下我是否可以使用 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:\slave\WinInstallerMegaPack\src\opencv\modules\objdetect\src\haar.cpp, line 1036
Exception in thread "main" java.lang.RuntimeException: C:\slave\WinInstallerMegaPack\src\opencv\modules\objdetect\src\haar.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 个答案:

答案 0 :(得分:6)

cvHaarDetectObjects()不仅用于检测面部的对象或形状,还取决于HaarCascade分类器。

如果您传递face haarcascade xml,那么它将返回一组面数,或者也可以使用eyenose等HaarCascade XML文件。您也可以使用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   .. \ OpenCV \ samples \ c \目录。

请参阅此chessboard detection sample in opencv

未知函数中的无效分类器级联错误表示您传递的分类器格式不正确或缺少某些内容。检查分类器xml文件是否有效。

答案 1 :(得分:2)

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