java集成opencv(不踩坑),实现人脸检测小demo(含上传人像图片识别接口),windows,IDEA,Springboot

简介: java集成opencv(不踩坑),实现人脸检测小demo(含上传人像图片识别接口),windows,IDEA,Springboot

先一步一步来,中间会讲解会踩到的坑。

作者环境:java11(最好用java8)

1.正常用maven导入坐标:

         <dependency>
            <groupId>org.openpnp</groupId>
            <artifactId>opencv</artifactId>
            <version>4.5.3-1</version>
        </dependency>

依赖下载完别急着写代码

你急着把测试代码写了会遇到:

库文件找不到异常

2.下载库文件:

下载对应版本

下载好运行解压到指定目录后一路打开找到这个opencv_java453.dll

3.下载模型文件:

这个是用于人脸识别的模型

4.把库文件粘贴到你的jdk的bin目录下

因为你在javase的测试main方法调用opencv的api,该api底层是会依赖opencv_java453.dll这个库的,jvm首先就在bin目录下查找该库,所以需要把库文件放bin下。

5.把模型文件放到你的项目目录

可以是根目录也可以像作者一样放src下:

6.编写你的javase测试代码

注意图片文件路径、模型文件路径,不要无脑copy过来直接运行,你只需要修改成你自己项目里面的路径就可以了

 
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
 
import java.util.Arrays;
import java.util.Base64;
 
 
 
/**
 * @author mijiupro
 */
 
public class FaceDetection {
 
    //人脸检测器
    private static final CascadeClassifier FACE_DETECTOR;
 
    //人脸模型xml文件路径
    private static final String FACE_MODEL_PATH = "src/main/java/com/mi9688/common/opencv/model/haarcascade_frontalface_alt.xml";
    //测试图片文件夹路径
    private static final String TRAINING_DATA_DIR = "src/main/java/com/mi9688/common/opencv/sample";
    //检测并处理后保存图片路径
    private static final String DETECTION_RESULT ="src/main/java/com/mi9688/common/opencv/result/result.jpg";
 
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);//加载库文件
        FACE_DETECTOR = new CascadeClassifier(FACE_MODEL_PATH);//创建级联分类器加载人脸模型xml文件
    }
 
    /**
     * 测试模型
     */
    public static void testModel() {
        // 加载样本图片
        Mat image = Imgcodecs.imread(TRAINING_DATA_DIR+"/1.jpg");
        // 检测人脸
        MatOfRect faceDetections = new MatOfRect();
        FACE_DETECTOR.detectMultiScale(image, faceDetections);
 
        int numFaces = faceDetections.toArray().length;
        System.out.println("人脸数量: " + numFaces);
        // 绘制标人脸识框并打印人脸位置坐标
        Arrays.stream(faceDetections.toArray()).forEach(
                (rect) -> {
                    Imgproc.rectangle(image, new Point(rect.x, rect.y),
                            new Point(rect.x + rect.width, rect.y + rect.height),
                            new Scalar(0, 255, 0));
                    System.out.println("坐标: (" + rect.x + ", " + rect.y + ")");
                });
 
        // 保存处理后的图片
        Imgcodecs.imwrite(DETECTION_RESULT, image);
    }
 
    public static void main(String[] args) {
        testModel();
 
    }
}

运行后你会得到:


恭喜你完成了第一步,当你把人脸识别封装成接口时,又会遇到惊喜,下面说一下这个惊喜。

7.编写前端提交人脸图片的后端人脸校验接口

继续在该测试类写个人脸校验静态方法

public static Boolean hasOneFace(String base64Image) {
        try {
            Mat imageMat = Imgcodecs.imdecode(new MatOfByte(Base64.getDecoder().decode(base64Image)), Imgcodecs.IMREAD_UNCHANGED);
            // 转换为灰度图像
            Mat grayImageMat = new Mat();
            Imgproc.cvtColor(imageMat, grayImageMat, Imgproc.COLOR_BGR2GRAY);
            // 检测人脸
            MatOfRect faceDetections = new MatOfRect();
            FACE_DETECTOR.detectMultiScale(grayImageMat, faceDetections, 1.1, 2, 0, new Size(30, 30));
 
            int numFaces = faceDetections.toArray().length;
            log.info("人脸数量: " + numFaces);
            if (numFaces != 1) {
                log.info("请确保人脸数量为1,且人脸位于图片正中央");
                return false;
            }
            Arrays.stream(faceDetections.toArray()).forEach(rect -> log.info("坐标: (" + rect.x + ", " + rect.y + ")"));
 
        } catch (Exception e) {
            log.info(e.getMessage());
        }
        return true;
    }

controller:

 @PostMapping("/staff-is-face1")
    public Result<?> isFaceByOpencv(@RequestBody String faceBase64) {
        if(FaceDetection.hasOneFace(faceBase64)){
            return Result.success();
        }
 
       return Result.error(ResultCode.FAIL);
    }

8惊喜:这时前端调用你的接口就会:

又出现库找不到异常了:

这时候你大概率引入了热部署依赖大部分都是这个原因:

这时你需要注释掉热部署导入,然后maven刷新依赖,重启就解决了。

如果还没有解决

那就在你的C:\Windows\System32目录也复制一份库文件opencv_java453.dll

ok到这里你99%已经可以愉快使用你的opencv了

9.注意:该依赖目前不支持java自训练模型,自训练接口仅对c++语言提供,社区补充版本的依赖可以支持模型自训练

地址如下:https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml

maven坐标:

         <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.9</version>
        </dependency>

具体看github官方文档

目录
相关文章
|
11月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
1580 12
|
人工智能 自然语言处理 分布式计算
AI 驱动传统 Java 应用集成的关键技术与实战应用指南
本文探讨了如何将AI技术与传统Java应用集成,助力企业实现数字化转型。内容涵盖DJL、Deeplearning4j等主流AI框架选择,技术融合方案,模型部署策略,以及智能客服、财务审核、设备诊断等实战应用案例,全面解析Java系统如何通过AI实现智能化升级与效率提升。
918 0
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
2761 0
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
存储 缓存 Java
Java中的分布式缓存与Memcached集成实战
通过在Java项目中集成Memcached,可以显著提升系统的性能和响应速度。合理的缓存策略、分布式架构设计和异常处理机制是实现高效缓存的关键。希望本文提供的实战示例和优化建议能够帮助开发者更好地应用Memcached,实现高性能的分布式缓存解决方案。
348 9
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
846 10
|
Java API Apache
java集成stable diffusion
通过REST API和JNI两种方法,我们可以在Java应用程序中集成Stable Diffusion模型。REST API方法更加简单和易于维护,而JNI方法则提供更高的性能。根据具体应用场景和需求,选择合适的集成方法,可以充分利用Stable Diffusion的强大功能,实现高效的图像生成和处理。
425 15
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
4067 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
1194 1
|
运维 网络安全 虚拟化
Windows系统镜像检测修复建议
Windows系统镜像检测修复建议