为啥这段代码不能检测人脸

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import util.ImageViewer;

import java.io.File;

public class FaceTest {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {



        detectFace("C:\\Users\\zrj\\Pictures\\tt.jpeg");
    }

    public static boolean detectFace(String imageFileName) {
        File f = new File(imageFileName);

        //原图片不存在直接退出
        if (!f.exists()) {
            System.out.println("\n Image File Not Found!");
            return false;
        }

        //加载分类器
        CascadeClassifier faceDetector =
                new CascadeClassifier();
        faceDetector.load("C:\\code\\VideoStreamConsumer\\src\\main\\resources\\lbpcascade_frontalcatface.xml");
        //读取图像
        Mat image0 = Imgcodecs.imread(imageFileName);
        ImageViewer imageViewer = new ImageViewer(image0);
        imageViewer.imshow();
        Mat image = new Mat();
        System.out.println("读取成功");
        //检测人脸
        Size min = new Size(100, 100);
        MatOfRect faceDetections = new MatOfRect();
        Imgproc.cvtColor(image0, image, Imgproc.COLOR_BGR2GRAY);

        faceDetector.detectMultiScale(image, faceDetections);
        //检测结果
        Rect[] rects = faceDetections.toArray();
        if (rects == null || rects.length == 0) {
            System.out.println(rects.length);
            return false;
        }
        int i = 0;
        for (Rect rect : rects) {
            Point x = new Point(rect.x, rect.y);
            Point y = new Point(rect.x + rect.width, rect.y + rect.height);
            //在image图片上画框,x,y可确定框的位置和大小,new Scalar(0, 255, 0)是框的颜色,自行调整
            Imgproc.rectangle(image, x, y, new Scalar(0, 255, 0));

            //保存监测的人脸小图片
            Rect r = new Rect(x, y);
            System.out.println(r.height + ":" + r.width);
            Mat areaM = new Mat(image, r);
            //保存监测的人脸小图片到tmp+序号的jpg文件
            String tmpFilePath = "\\opencv" + i + ".jpg";

            Imgcodecs.imwrite(tmpFilePath, areaM);
            i++;
        }



        image.release();
        return true;

    }

}

这段代码的逻辑大概是这样:调用opencv自己的人脸分类器,然后用矩形框出人脸的范围,但是Rect[] rects = faceDetections.toArray();这段代码的返回值始终是一个空数组,也是就是他根本没有检测到人脸,这是为啥啊?

阅读 1.3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题