【人脸检测】OpenCV调用深度学习模型实现人脸检测-java

介绍

这个Dome是利用OpenCV加载Tensorflow训练的模型,然后返回图片中人脸的位置信息,然后再显示出来

效果,大家可以参考这里7.46 复制打开抖音,看看【写的一手烂代码的作品】人脸检测 java也能用深度学习模型,识别率还挺高... https://v.douyin.com/iU8cUxj5/ zGi:/ 07/10 x@s.eb

说明

  • 为了方便大家直接使用,我把代码封装到jar包中了,后期有时间我上传到maven仓库
  • 想要了解原理的,可以直接反编译看jar代码,其实也没有几行,很简单
  • 我写了2个列子,一个是图片,一个摄像头显示的视频,识别其实只有一行代码FaceDetection.getInstance().action(imgPath);

步骤

jar包和备用的图片

jar下载地址:https://files.yixueai.cn/jar/face-detections-0.31.jar

识别图片的代码

复制代码
import com.lancode.Face;
import com.lancode.FaceDetection;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.List;

public class Demo {
    public static void main(String[] args) throws Exception {
        // 随便找一个张带有人脸的图片
        String imgPath = "E:\\age_gender.jpg";
        // =================关键代码==============
        List<Face> rets = FaceDetection.getInstance().action(imgPath);
        // =================关键代码==============
        Mat frame = Imgcodecs.imread(imgPath);
        for (Face face : rets) {
            System.out.println("左上角坐标信息 = (" + face.getX() +"," + face.getY() + ")  人脸的高度 = " + face.getHeight() + " 人脸的宽度 = " + face.getWidth() + " 有多少把握是正确的" + face.getScore());
            // 下面是将信息在原图中画出来显示出来,实际不需要的代码
            Rect rect = new Rect((int)face.getX(), (int)face.getY(), (int)face.getWidth(), (int)face.getHeight());
            Imgproc.rectangle(frame, rect, new Scalar(0, 0, 255), 2 , 8);
            Imgproc.putText(frame, String.format("%.2f", face.getScore()), new Point(rect.x, rect.y-5), Imgproc.FONT_HERSHEY_COMPLEX,1.0,new Scalar(255,0,0));
        }
        // 显示画好后的图片
        HighGui.imshow("LanCode人脸检测演示", frame);
        HighGui.waitKey(0);
    }
}

代码效果

视频的代码

复制代码
import com.lancode.Face;
import com.lancode.FaceDetection;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;

import java.util.List;

public class CameraDisplay {


    public static void main(String[] args) throws Exception {
        // 获取FaceDetection类
        FaceDetection instance = FaceDetection.getInstance();
        // 打开默认摄像头
        VideoCapture camera = new VideoCapture(0);

        // 检查摄像头是否成功打开
        if (!camera.isOpened()) {
            System.out.println("无法打开摄像头");
            return;
        }

        // 创建一个窗口
        HighGui.namedWindow("摄像头", HighGui.WINDOW_AUTOSIZE);

        // 定义一个Mat对象来存储帧
        Mat frame = new Mat();

        // 循环读取摄像头帧
        while (true) {
            // 读取新一帧
            camera.read(frame);
            // ======关键代码==========
            List<Face> faces = instance.action(frame);
            // ======关键代码==========
            // 下面和图片是一样的
            for (Face face : faces) {
                Rect rect = new Rect((int)face.getX(), (int)face.getY(), (int)face.getWidth(), (int)face.getHeight());
                Imgproc.rectangle(frame, rect, new Scalar(0, 0, 255), 2 , 8);
                Imgproc.putText(frame, String.format("%.2f", face.getScore()), new Point(rect.x, rect.y-5), Imgproc.FONT_HERSHEY_COMPLEX,1.0,new Scalar(255,0,0));
            }

            // 如果读取帧成功,显示在窗口中
            if (!frame.empty()) {
                HighGui.imshow("摄像头", frame);
            } else {
                System.out.println("没有捕获到帧,退出...");
                break;
            }
            // 按 'q' 键退出循环
            if (org.opencv.highgui.HighGui.waitKey(1) == 'q') {
                break;
            }
        }
        // 释放摄像头资源
        camera.release();
        // 销毁所有窗口
        org.opencv.highgui.HighGui.destroyAllWindows();
    }

}
相关推荐
Java小生不才10 分钟前
Spring AI文生音
java·人工智能·spring
凯尔萨厮14 分钟前
Springboot2.x+Thymeleaf项目创建
java
fish_xk26 分钟前
map和set
java·开发语言
大模型最新论文速读39 分钟前
Select to Think:蒸馏 token 排序能力,效果平均提升24%
论文阅读·人工智能·深度学习·机器学习·自然语言处理
Studying 开龙wu39 分钟前
深度学习PyTorch 实战九:YOLOv1目标检测从标注-训练-预测
pytorch·深度学习·yolo
李崧正40 分钟前
Java技术分享:Lambda表达式与函数式编程
java·开发语言·python
老了,不知天命42 分钟前
鳶尾花項目JAVA
java·开发语言·机器学习
二哈赛车手1 小时前
新人笔记---实现简易版的rag的bm25检索(利用ES),以及RAG上传时的ES与向量数据库双写
java·数据库·笔记·spring·elasticsearch·ai
winner88811 小时前
从零吃透C++命名空间、std、#include、string、vector
java·开发语言·c++
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第26题:Java的抽象类和接口有哪些区别
java·开发语言·面试