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

介绍

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

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

说明

  • 为了方便大家直接使用,我把代码封装到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();
    }

}
相关推荐
weixin_448781626 分钟前
DenseNet算法 实现乳腺癌识别
pytorch·深度学习·神经网络
扎瓦11 分钟前
ThreadLocal 线程变量
java·后端
T.D.C25 分钟前
【OpenCV】使用opencv找哈士奇的脸
人工智能·opencv·计算机视觉
BillKu29 分钟前
Java后端检查空条件查询
java·开发语言
jackson凌34 分钟前
【Java学习笔记】String类(重点)
java·笔记·学习
刘白Live1 小时前
【Java】谈一谈浅克隆和深克隆
java
一线大码1 小时前
项目中怎么确定线程池的大小
java·后端
要加油哦~1 小时前
vue · 插槽 | $slots:访问所有命名插槽内容 | 插槽的使用:子组件和父组件如何书写?
java·前端·javascript
crud1 小时前
Spring Boot 3 整合 Swagger:打造现代化 API 文档系统(附完整代码 + 高级配置 + 最佳实践)
java·spring boot·swagger
天天摸鱼的java工程师1 小时前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql