当前位置: 代码网 > it编程>编程语言>Java > java集成opencv(不踩坑),实现人脸检测小demo(含上传人像图片识别接口),windows,IDEA,Springboot

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

2024年07月31日 Java 我要评论
先一步一步来,中间会讲解会踩到的坑。作者环境:java11(最好用java8)

目录

1.正常用maven导入坐标:

2.下载库文件:

3.下载模型文件:

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

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

6.编写你的javase测试代码

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

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

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


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

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

1.正常用maven导入坐标:

         <dependency>
            <groupid>org.openpnp</groupid>
            <artifactid>opencv</artifactid>
            <version>4.5.3-1</version>
        </dependency>

依赖下载完别急着写代码

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

库文件找不到异常

2.下载库文件:

releases - opencvicon-default.png?t=n7t8https://opencv.org/releases/

下载对应版本

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

3.下载模型文件:

https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xmlicon-default.png?t=n7t8https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml

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

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官方文档

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com