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

发布于 2022-09-11 22:58:58 字数 2392 浏览 18 评论 0

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();这段代码的返回值始终是一个空数组,也是就是他根本没有检测到人脸,这是为啥啊?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文