Java cvHaarDetectObjects()方法做什么?

Java cvHaarDetectObjects()方法做什么?,java,image-processing,opencv,javacv,Java,Image Processing,Opencv,Javacv,请一些专家解释一下,我们是否可以使用cvhaardeticobjects()方法来检测正方形并获得宽度和高度?我发现了一个使用此方法进行人脸检测的代码,但我需要知道是否可以将其用于矩形检测 String src="src/squiredetection/MY.JPG"; IplImage grabbedImage = cvLoadImage(src); IplImage grayImage = IplImage.create(grabbedImage.width()

请一些专家解释一下,我们是否可以使用cvhaardeticobjects()方法来检测正方形并获得宽度和高度?我发现了一个使用此方法进行人脸检测的代码,但我需要知道是否可以将其用于矩形检测

    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);
        }

请给出简单的代码示例。

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) );
以上代码摘自此网站:

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

如果您传递
face haarcascade xml
,则它将返回一个面数组,或者还可以使用
eye
nose
等haarcascade xml文件。您还可以通过使用
opencv\u 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
}
CvSeq faces=cvhaardeticobjects(灰度图像、分类器、存储器、,
1.1,3,CV_HAAR_DO_CANNY_修剪);
对于(int i=0;i
详述

对于矩形检测:

OpenCV
中有一个矩形检测的例子,他们使用它来检测 棋盘上的方块。查看中的
squares.c
..\OpenCV\samples\c\目录

看到这个了吗


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

这是否意味着它不能用于检测矩形,不是吗?这不是问题所在,因为在javacv中,我们可以无误地分配它。我检查javacv doc,它(cvHaarDetectObjects()方法)只返回CvSeq。当我尝试为其添加数组或链接列表时,它抛出编译时错误,表示类型不兼容。您是否下载了OpenCV的二进制文件(已编译到系统版本)或在系统中编译源代码?
CvSeq faces = cvHaarDetectObjects(grayImage, classifier, storage,
                1.1, 3, CV_HAAR_DO_CANNY_PRUNING);

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