【问题标题】:What does cvHaarDetectObjects() method do?cvHaarDetectObjects() 方法有什么作用?
【发布时间】:2012-06-27 19:13:12
【问题描述】:

请专家解释一下我们是否可以使用 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)

请提供简单的代码示例。

【问题讨论】:

    标签: java image-processing opencv javacv


    【解决方案1】:

    cvHaarDetectObjects() 不仅用于人脸检测对象或形状,还依赖于HaarCascade 分类器。

    如果你传递face haarcascade xml,那么它将返回一个人脸数组,或者也可以使用eyenose等HaarCascade XML文件。您还可以通过使用opencv_traincascade.exe 创建自己的正样本和负样本来自定义haarcascade xml

    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\ 目录。

    看到这个chessboard detection sample in opencv

    Invalid classifier cascade in unknown function 错误意味着您传递的分类器格式不正确或缺少某些内容。检查您的分类器 xml 文件是否有效。

    【讨论】:

      【解决方案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

      【讨论】:

      • 是不是不能用来检测矩形??
      • 这不是问题,因为在 javacv 中我们可以毫无错误地分配它。我检查了 javacv 文档,它(cvHaarDetectObjects() 方法)只返回 CvSeq。当我尝试为此添加数组或链接列表时,它会抛出编译时错误,说明类型不兼容。
      • 您是否下载了 OpenCV 的二进制文件(已编译到您的系统版本)或在您的系统中编译源代码?
      猜你喜欢
      • 2012-07-26
      • 2015-04-07
      • 2018-10-23
      • 2011-09-01
      • 2010-11-03
      • 2019-09-19
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多