【人脸检测】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();
    }

}
相关推荐
MrZhangBaby4 分钟前
SQL-leetcode—1158. 市场分析 I
java·sql·leetcode
一只淡水鱼6618 分钟前
【spring原理】Bean的作用域与生命周期
java·spring boot·spring原理
五味香24 分钟前
Java学习,查找List最大最小值
android·java·开发语言·python·学习·golang·kotlin
AIGC大时代26 分钟前
方法建议ChatGPT提示词分享
人工智能·深度学习·chatgpt·aigc·ai写作
jerry-8938 分钟前
Centos类型服务器等保测评整/etc/pam.d/system-auth
java·前端·github
Jerry Lau39 分钟前
大模型-本地化部署调用--基于ollama+openWebUI+springBoot
java·spring boot·后端·llama
小白的一叶扁舟43 分钟前
Kafka 入门与应用实战:吞吐量优化与与 RabbitMQ、RocketMQ 的对比
java·spring boot·kafka·rabbitmq·rocketmq
幼儿园老大*44 分钟前
【系统架构】如何设计一个秒杀系统?
java·经验分享·后端·微服务·系统架构
言之。1 小时前
【Java】面试中遇到的两个排序
java·面试·排序算法
计算机-秋大田1 小时前
基于SSM的家庭记账本小程序设计与实现(LW+源码+讲解)
java·前端·后端·微信小程序·小程序·课程设计