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

}
相关推荐
蒸蒸yyyyzwd3 小时前
cpp对象模型学习笔记1.1-2.8
java·笔记·学习
程序员徐师兄4 小时前
Windows JDK11 下载安装教程,适合新手
java·windows·jdk11 下载安装·jdk11 下载教程
RANCE_atttackkk4 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
五岳5 小时前
DTS按业务场景批量迁移阿里云MySQL表实战(下):迁移管理平台设计与实现
java·应用·dts
zhougl9965 小时前
Java 所有关键字及规范分类
java·开发语言
Python 老手5 小时前
Python while 循环 极简核心讲解
java·python·算法
java1234_小锋6 小时前
Java高频面试题:MyISAM索引与InnoDB索引的区别?
java·开发语言
Mr_Xuhhh6 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
林深现海6 小时前
【刘二大人】PyTorch深度学习实践笔记 —— 第一集:深度学习全景概述(超详细版)
pytorch·笔记·深度学习
测试开发Kevin7 小时前
小tip:换行符CRLF 和 LF 的区别以及二者在实际项目中的影响
java·开发语言·python