Java项目中使用OpenCV检测人脸的应用

news2024/11/21 0:38:10

Java项目中使用OpenCV检测人脸的应用

一、准备工作

将下载好的opencv的jar包放在项目的根目录下,可以新建一个lib的文件夹,将其放在此处;
在这里插入图片描述

在pom文件中引入:

    <profiles>
	<!-- 生产环境 -->
        <profile>
            <id>pro</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <profiles.active>pro</profiles.active>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.opencv</groupId>
                    <artifactId>opencv</artifactId>
                    <version>480</version>
                    <scope>system</scope>
                    <systemPath>${project.basedir}/lib/opencv-480.jar</systemPath>
                </dependency>
            </dependencies>
        </profile>
    </profiles>

二、编写人脸库初始化

以下是基于Windows环境,Linux环境中同理
在你的application-dev.properties文件中配置好opencv的文件地址:
############################################################################################################################################

openCV配置

############################################################################################################################################
opencv.lib.path=C:/OpenCV/opencv/build/java/x64/opencv_java480.dll
opencv.face.detector.path=C:/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml

基础配置属性注入,新建一个config文件夹存放SimpFaceProperties类:


@Getter
@Configuration
public class SimpFaceProperties {

    /**
     * opencv库绝对路径
     */
    @Value("${opencv.lib.path:}")
    private String openCvLibPath;

    /**
     * opencv模型数据
     */
    @Value("${opencv.face.detector.path:}")
    private String openCvFaceXml;
}


可以在你的项目中新建一个专门存放人脸相关服务的模块module,如init文件夹下中的:


@Slf4j
@Component("InitLoadLib")
@SuppressWarnings("all")
public class InitLoadLib {

    /**
     * 是否加载库
     */
    private static boolean IS_LIB_OPEN = false;

    private static CascadeClassifier faceDetector;

    @Resource
    private SimpFaceProperties simpFaceProperties;

    /**
     * 项目初始化完成后加载lib库
     */
    @PostConstruct
    public void init() {
        if (StringUtils.isBlank(simpFaceProperties.getOpenCvLibPath())) {
            log.error("---> init opencv 库未配置");
            return;
        }
        boolean isAbsolutePath = simpFaceProperties.getOpenCvLibPath().contains("/") || simpFaceProperties.getOpenCvLibPath().contains("\\");
        // 判断是不是填写的绝对路径
        if (isAbsolutePath && !FileUtil.exist(simpFaceProperties.getOpenCvLibPath())) {
            log.error("---> init opencv 库不存在:{}", simpFaceProperties.getOpenCvLibPath());
            return;
        }
        try {
            // 获取系统类型
            String os = System.getProperty("os.name").toLowerCase();
            // 判断是不是windows
            if (os.contains("windows")) {
                log.info("---> init opencv Windows系统");
                if (isAbsolutePath) {
                    System.load(simpFaceProperties.getOpenCvLibPath());
                } else {
                    System.loadLibrary(simpFaceProperties.getOpenCvLibPath());
                }
                IS_LIB_OPEN = true;
            } else if (os.contains("linux")) {
                log.info("---> init opencv Linux系统");
                if (isAbsolutePath) {
                    System.load(simpFaceProperties.getOpenCvLibPath());
                } else {
                    System.loadLibrary(simpFaceProperties.getOpenCvLibPath());
                }
                IS_LIB_OPEN = true;
            } else {
                log.error("---> init opencv 不支持该系统");
            }
            if (IS_LIB_OPEN) {
                faceDetector = new CascadeClassifier(simpFaceProperties.getOpenCvFaceXml());
            }
        } catch (Exception e) {
            log.error("---> init opencv 库加载失败:{}", e.getMessage());
            IS_LIB_OPEN = false;
        }
    }

    public static boolean isOpenCvLib() {
        return IS_LIB_OPEN;
    }

    public static CascadeClassifier getFaceDetector() {
        return faceDetector;
    }
}

三、编写人脸服务接口业务

控制层中的接口代码:


/**
* 人脸检测
* @param file 文件
* @throws IOException 异常
*/
@PostMapping("faceDetection")
public Object faceDetection(MultipartFile file) throws IOException {
    int rlsl = simpFaceService.faceDetection(file);
    Map<String, Object> resMap = new HashMap<>();
    resMap.put("rlsl", rlsl);
    return resMap;
}

新建一个service文件夹,存放SimpFaceService接口服务类:


public interface SimpFaceService {

    /**
     * 检测图片上人脸数量
     * @param file 文件(支持MultipartFile, InputStream, URL(网络文件地址),String(本地文件地址))
     * @return 人脸数量
     * @throws IOException 异常
     */
    int faceDetection(Object file) throws IOException;
}

该接口服务的实现类:


@Service
public class SimpFaceServiceImpl implements SimpFaceService {

    @Resource
    private SimpFaceProperties simpFaceProperties;

    /**
     * 检测图片上人脸数量
     * @param file 文件(支持MultipartFile, InputStream, URL(网络文件地址),String(本地文件地址))
     * @return 人脸数量
     * @throws IOException 异常
     */
    @Override
    public int faceDetection(Object file) throws IOException {
        if (!InitLoadLib.isOpenCvLib()) {
            return 0;
        }
        // 文件转byte数组
        byte[] byteArray = this.fileToBytes(file);
        // 读取图片
        Mat mat = Imgcodecs.imdecode(new MatOfByte(byteArray), Imgcodecs.IMREAD_UNCHANGED);
        // 目标灰色图像
        Mat dstGrayImg = new Mat();
        // 转换灰色
        Imgproc.cvtColor(mat, dstGrayImg, Imgproc.COLOR_BGR2GRAY);
        // 检测脸部
        MatOfRect face = new MatOfRect();
        // 检测图像中的人脸
        InitLoadLib.getFaceDetector().detectMultiScale(dstGrayImg, face);
        return face.rows();
    }

    private byte[] fileToBytes(Object file) throws IOException {
        if (file instanceof MultipartFile) {
            return IoUtil.readBytes(((MultipartFile) file).getInputStream());
        }
        if (file instanceof URL) {
            return HttpUtil.downloadBytes(((URL) file).getPath());
        }
        if (file instanceof InputStream) {
            return IoUtil.readBytes((InputStream) file);
        }
        if (file instanceof String) {
            return FileUtil.readBytes((String) file);
        }
        return null;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用智能插件(Fitten Code: Faster and Better AI Assistant)再次修改vue3 <script setup>留言板

<template><div><button class"openForm" click"openForm" v-if"!formVisible">编辑</button><button click"closeForm" v-if"formVisible">取消编辑</button><hr /><formv-i…

Java求职季 必备知识脑图 收藏起来 !!!

Java初中级知识脑图 面试超实用 1.Git 下载链接 导图下载地址 &#xff1a; https://mm.edrawsoft.cn/mobile-share/index.html?uuid31d00742157057-src&share_type1 2.JUC 下载链接 https://mm.edrawsoft.cn/mobile-share/index.html?uuid6c0be457444921-src&s…

自动控制:滑模控制(Sliding Mode Control, SMC)

自动控制&#xff1a;滑模控制(Sliding Mode Control, SMC) 滑模控制&#xff08;Sliding Mode Control, SMC&#xff09;是一种在处理非线性系统时非常有效的控制技术。它通过驱动系统状态达到并保持在特定的滑模面附近&#xff0c;来实现控制目标。本文将介绍滑模控制的基本…

MES系统助力制造业数字化转型

一、MES系统的定义和功能 MES&#xff08;Manufacturing Execution System&#xff09;即制造执行系统&#xff0c;是一种可层级化管理生产活动的软件系统。它可以实现对生产过程全面的监控、调度、控制和优化&#xff0c;提高生产的效率、质量和安全性。MES系统具有以下几个主…

工作手机安全管理平台建设方案

第一章 项目背景 移动互联网的时代&#xff0c;各个行业在在推进移动办公和掌上办公&#xff0c;通过智能手机、平板电脑等进行线上办公&#xff0c;这样能提高了企业人员的办公效率&#xff0c;从而为客户提供更及时的服务。 在移动办公提高了工作人员办公效率的同时&#xf…

这三款使用的视频、图片设计工具,提供工作效率

Videograp Videograp是一款专注于视频生成的工具&#xff0c;特别适合需要快速剪辑和编辑视频的用户。Videograp具备以下特点&#xff1a; 影音比例转换&#xff1a;Videograp支持调整视频的分辨率和比例&#xff0c;使其更适合不同的播放环境和设备。 AI快剪&#xff1a;该工…

牛客链表刷题(一)

目录 题目一&#xff1a;反转链表 代码&#xff1a; 题目二&#xff1a;链表内指定区间反转 代码&#xff1a; 题目一&#xff1a;反转链表 代码&#xff1a; import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int …

Java多线程编程与并发处理

引言 在现代编程中&#xff0c;多线程和并发处理是提高程序运行效率和资源利用率的重要方法。Java提供了丰富的多线程编程支持&#xff0c;包括线程的创建与生命周期管理、线程同步与锁机制、并发库和高级并发工具等。本文将详细介绍这些内容&#xff0c;并通过表格进行总结和…

深度学习常见概念解释(三)——激活函数定义,作用与种类(附公式,求导,图像和代码)

激活函数 前言作用激活函数种类1. ReLU (Rectified Linear Unit)2. Leaky ReLU3. ELU (Exponential Linear Unit)4. Sigmoid5. Tanh6. Swish 结论 前言 在深度学习中&#xff0c;激活函数是神经网络中的一个关键组件&#xff0c;起着引入非线性因素的作用&#xff0c;从而增加…

HTML+CSS 动态卡片

效果演示 实现了一个带有动态背景和图片放大效果的卡片展示。卡片的背景是由两种颜色交替组成的斜线条纹&#xff0c;同时背景会以一定速度循环滚动。当鼠标悬停在卡片上时&#xff0c;卡片的图片会放大&#xff0c;并且卡片的背景会变为彩色。 Code HTML <!DOCTYPE html&…

Windows defender bypass | 免杀

官方文档 在制作免杀的过程中,翻找 Windows 官方对 Windows Defender 的介绍,发现有这样一个目录:Configure Microsoft Defender Antivirus exclusions on Windows Server(在 Windows server 中配置defender排除项)。 https://docs.microsoft.com/en-us/microsoft-365/se…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】线性分类模型损失函数对比

本节均以二分类问题为例进行展开&#xff0c;统一定义类别标签 y ∈ { 1 , − 1 } y\in\{1,-1\} y∈{1,−1}&#xff0c;则分类正确时 y f ( x ; w ) > 0 yf(x;w)>0 yf(x;w)>0&#xff0c;且值越大越正确&#xff1b;错误时 y f ( x ; w ) < 0 yf(x;w)<0 yf(x;…

大数计算器(加减乘除)

#define _CRT_SECURE_NO_DEPRECATE 1#include<stdio.h> #include<string.h> #define N 200 #define jc_MAX 4000//输入 void input_digit(char s1[], char s2[]) {printf("请输入第一个数&#xff1a;");scanf("%s", s1);printf("请输入第…

郑州申请大气污染防治乙级资质,这些材料必不可少

在郑州申请大气污染防治乙级资质时&#xff0c;以下材料是必不可少的&#xff1a; 一、企业基础资料&#xff1a; 企业法人营业执照副本&#xff1a;需清晰&#xff0c;且在有效期内[1][2]。企业章程&#xff1a;提交企业章程的扫描件或复印件&#xff0c;以展示企业的组织结构…

基于机器学习和深度学习的轴承故障诊断方法(Python)

在工业早期&#xff0c;设备故障诊断通常由专家通过观察设备运行中的变量参数并结合自身知识进行诊断。但相比传统的机理分析方法&#xff0c;数据驱动的智能设备故障诊断更能充分提取数据中隐含的故障征兆、因果逻辑等关系。智能设备故障诊断的优势表现在其对海量、多源、高维…

【Python】已完美解决:ERROR: Could not find a version that satisfies the requirement re

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;“ERROR: Could not find a version that satisfies the requirement re”的问题 一、问题背景 在使用Python的pip包管理器安…

codegeex2-6b-int4 部署

codegeex2-6b-int4 模型文件 CodeGeeX2 仓库文件地址 CodeGeeX2 推理教程 conda create -n codegeex2 python3.10 -y conda activate codegeex2 pip install -r requirements.txt -i https://pypi.mirrors.u…

2024中国翻译行业发展报告

来源&#xff1a;中国翻译协会 近期历史回顾&#xff1a; 2024国内工商业储能市场研究报告.pdf 2023幸福企业白皮书.pdf 2024年欧亚地区移动经济报告.pdf 内容供应链变革 2023人工智能与首席营销官&#xff08;CMO&#xff09; AI科技对PC产业的影响.pdf 金融业数据应用发展报…

成都晨持绪:抖音电商新手怎么做可信

在如今这个信息爆炸的时代&#xff0c;抖音作为新兴的电商平台&#xff0c;为许多创业者和商家提供了展示和销售产品的新渠道。然而&#xff0c;对于刚入行的新手来说&#xff0c;如何在抖音上建立起一个可信的电商身份&#xff0c;却是一个值得深思的问题。 要确保所售卖的产品…

短剧分销市场动态:机遇挑战双重解读

一、引言 近年来&#xff0c;随着互联网的快速发展和智能手机的普及&#xff0c;短视频和短剧逐渐成为人们日常娱乐的重要组成部分。短剧以其短小精悍、情节紧凑的特点&#xff0c;吸引了大量观众的关注和喜爱。而短剧分销市场则应运而生&#xff0c;为内容创作者和平台方提供了…