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

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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】解决C语言报错:Uninitialized Variable

文章目录 简介什么是Uninitialized VariableUninitialized Variable的常见原因如何检测和调试Uninitialized Variable解决Uninitialized Variable的最佳实践详细实例解析示例1&#xff1a;局部变量未初始化示例2&#xff1a;数组未初始化示例3&#xff1a;指针未初始化示例4&am…

Java的三个接口Comparable,Comparator,Cloneable(浅拷贝与深拷贝)

Comparable 当我们要进行对象的比较的时候&#xff0c;我们是不能直接用>、< 这些符号直接进行比较的。 由于这是引用类型变量也是自定义类型变量&#xff0c;直接进行比较的时候&#xff0c;我们是通过对象的地址进行比较的&#xff0c;我们可以使用、! 进行两个对象的…

深入学习Java `synchronized` 关键字

深入学习Java synchronized 关键字 synchronized关键字通过确保在同一时间只有一个线程可以执行某个代码块&#xff0c;从而防止多个线程同时访问共享资源时发生数据不一致的问题。 修饰方法 当synchronized用于修饰实例方法时&#xff0c;表示当前实例对象是同步锁。这意味…

暑期计划打卡清单表怎么写 暑期待办计划清单

暑假来临&#xff0c;是不是感觉时间好像突然多了起来&#xff0c;但又不知道该做些什么好&#xff1f;别担心&#xff0c;列一个暑期计划打卡清单表&#xff0c;就能让你的暑假生活变得有条不紊、充实而有意义。 计划清单&#xff0c;就像是给暑假生活绘制的一张地图。没有它…

geopandas缓冲区相交分析(数据量大时推荐)

geopandas缓冲区相交分析(数据量大时推荐) 目录 1.需求 2.实现代码 3.其它 1.需求 [1] 不采用arcgis、qgis等软件实现 [2] 需要自己编写1个gui软件实现相关功能&#xff0c;那么就不能使用arcpy环境 [3] 采用python自己写代码实现 功能需求&#xff1a;点shp、线shp&#x…

06眼动识别系统-改版

06眼动识别系统-改版 原先的模块组成示意图优缺点 新模块设计优缺点 软件方面结语其他以下是废话 试验&#xff0c;本身就是一个摸索的过程&#xff0c;在上一阶段的试验中&#xff0c;我们发现硬件的连接模式&#xff0c;给试验造成了很多麻烦&#xff0c;所以决定对硬件的连接…

SPI协议硬件回环测试

简介 1.单片机型号&#xff1a;STM32L431RCT6 2.方式&#xff1a;硬件上的回环测试 3.使用软件&#xff1a;CubeIDE 一、 软件配置 1.硬件原理图 通过原理图我们可以看出对于我们较为重要的四个管脚为&#xff1a;PA15、PC10、PC11、PC12&#xff1b;下面来配置这四个管脚 1.…

目标检测——TNO多波段图像数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 T…

R语言数据分析案例31-运用差分整合移动平均自回归模型对世界主要国家(俄罗斯)的污染物排放量进行研究预测

一、研究背景与意义 空气污染导致的环境恶化已经成为世界各国许多国家和地区发展受限的重要原因。空气污染物是由气态物质、挥发性物质、半挥发性物质和颗粒物质的混合物造成的&#xff0c;其中典型 的空气污染物就是人们生活中经常使用到的高频词汇雾霾。本文主要对其中的污染…

黄仁勋加州理工毕业典礼演讲:人工智能是我们这个时代最重要的技术

英伟达公司首席执行官黄仁勋周五&#xff08;6月14日&#xff09;在加州理工学院&#xff08;Caltech&#xff09;毕业典礼上发表演讲&#xff0c;鼓励毕业生在逆境中努力&#xff0c;不断寻求新的机遇。 黄说&#xff0c;加州理工学院因其毕业生受人尊敬而闻名&#xff0c;如…

查询Kafka集群中消费组(group)信息和对应topic的消费情况

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

玩转nRF52840-DK开发套件(4)

nRF52840-DK 开发套件UART interface through a virtual serial port &#xff0c;如下 串口初始化以及引脚定义&#xff1a; const app_uart_comm_params_t comm_params {RX_PIN_NUMBER,TX_PIN_NUMBER,RTS_PIN_NUMBER,CTS_PIN_NUMBER,UART_HWFC,false, #if defined (UART_PRES…

如何量化管理研发团队的技术债务?

在探讨技术债的成因之前&#xff0c;我们需要澄清一些关于技术债起因和本质的普遍误解。 误解一&#xff1a;技术债务等同于劣质代码 那么&#xff0c;什么构成了所谓的「劣质代码」&#xff1f; 所谓的好代码&#xff0c;可能是指那些整洁、不会在未来限制你决策的代码&…

Type-C诱骗芯片LDR6500

随着科技的飞速发展&#xff0c;电子设备的智能化和便携化已成为趋势。在这个过程中&#xff0c;Type-C接口因其高速传输、正反可插以及强大的扩展能力&#xff0c;逐渐成为主流接口标准。然而&#xff0c;Type-C接口的广泛应用也带来了一系列挑战&#xff0c;其中之一便是如何…

CENTOS7.9下服务器双网卡bond模式6配置示例

​1.bond口的特点 bond口通过将多个网口进行聚合&#xff0c;多个网口聚合后一方面实现了大带宽传输&#xff0c;另外多网口聚合后也同时具有冗余特性&#xff0c;当其中一个网口down掉后&#xff0c;其他网口会继续转发流量&#xff0c;不会导致流量中断。 2.使用条件 当环境…

wireshark使用情况与网口调试记录

wireshark使用情况与网口调试记录 前言wireshark无法获取本地数据方法一——Npcap方法二——WinPcap效果 UDP组播&#xff0c;却一直捕获到127.0.0.1总结 前言 在网口调试中&#xff0c;wireshark使用较多&#xff0c;常出现一些无法捕获或者ip获取数据不正确的情况&#xff0…

探索设计模式——单例模式详解

前言&#xff1a;设计模式的作用主要是为了——利用设计方式的重用来自动地提高代码的重新利用、提高代码的灵活性、节省时间&#xff0c; 提高开发效率、低耦合&#xff0c;封装特性显著&#xff0c; 接口预留有利于扩展。 设计模式的种类有很多种&#xff0c;本篇内容主要讲解…

目标检测顶会新成果!20个突破性方法,更高性能,更强理解与分析能力!

【目标检测】在近年来的深度学习领域中备受关注&#xff0c;它通过识别和定位图像中的目标对象&#xff0c;提升了模型在图像理解和分析方面的能力。目标检测技术在自动驾驶、安防监控和医疗影像分析等任务中取得了显著成果。其独特的方法和卓越的表现使其成为研究热点之一。 为…

我整理的面向大模型的高质量语料集!

自己一直在做企业内部的垂类大模型&#xff0c;但随着运营深入&#xff0c;发现光有企业内部的领域数据还不足以微调出一个健壮的领域大模型&#xff0c;因为泛化能力比较弱。 在领域数据中融入公共数据进行训练是公认的提升领域大模型泛化能力的方法&#xff0c;下面是我整理的…