广告
返回顶部
首页 > 资讯 > 精选 >springboot集成opencv如何实现人脸识别功能
  • 165
分享到

springboot集成opencv如何实现人脸识别功能

2023-06-15 10:06:31 165人浏览 八月长安
摘要

这篇文章主要介绍SpringBoot集成OpenCV如何实现人脸识别功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言项目中检测人脸图片是否合法的功能,之前用的是百度的人脸识别接口,由于成本高昂不得不寻求替代方案

这篇文章主要介绍SpringBoot集成OpenCV如何实现人脸识别功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

前言

项目中检测人脸图片是否合法的功能,之前用的是百度的人脸识别接口,由于成本高昂不得不寻求替代方案。

什么是opencv?

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在linuxwindowsAndroidMac OS操作系统上。轻量级而且高效——由一系列 C 函数和少量 c++ 类构成,同时提供了python、Java、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法

项目集成步骤

由于项目是放在Linux系统中跑的,开发环境是Windows10,所以项目中涉及到opencv的要分两套。

准备工作

 Windows安装opencv

opencv官网下载安装包https://opencv.org/releases/

springboot集成opencv如何实现人脸识别功能

我这里选择的是4.1.1版本
分别下载了Windows版本和源码

springboot集成opencv如何实现人脸识别功能

Windows环境下集成

安装opencv,没什么说的,指定一个路径安装即可,注意安装路径不能是中文。
项目中集成的三个关键点

  • 引入jar依赖

  • 读取OpenCV自带的人脸识别特征XML文件

  • 配置opencv的库文件地址

关键点1:引入jar包

jar包位置在安装路径下的java文件夹中

springboot集成opencv如何实现人脸识别功能

两种方式引入

方式一:idea添加jar

springboot集成opencv如何实现人脸识别功能

或者直接在Libraries中添加二者皆可。

方式二:将jar上传至私服,在Maven中引入

我这里是将jar上传至私服,然后引用的。
注意Windows版的jar和Linux中的jar不一样,二者要区分开来
通过Maven配置在不同环境下加载不同的jar

<profiles>    <profile>        <id>dev</id>        <dependencies><!--            本地引用--><!--                <dependency>--><!--                    <groupId>op</groupId>--><!--                    <artifactId>opencv</artifactId>--><!--                    <version>411</version>--><!--                    <scope>system</scope>--><!--                    <systemPath>--><!--                        ${project.basedir}/src/main/resources/opencv/windows/opencv-411.jar--><!--                    </systemPath>--><!--                </dependency>-->            <!--            仓库引用-->            <dependency>            <!--                这里改成自己的仓库地址-->                <groupId>com.***.cloud.resource</groupId>                <artifactId>opencv-window</artifactId>                <version>411</version>            </dependency>        </dependencies>        <activation>            <activeByDefault>true</activeByDefault>        </activation>    </profile>    <profile>        <id>test</id>        <dependencies>            <dependency>            <!--                这里改成自己的仓库地址-->                <groupId>com.***.cloud.resource</groupId>                <artifactId>opencv-linux</artifactId>                <version>411</version>            </dependency>        </dependencies>    </profile></profiles>

关键点2:配置人脸识别特征XML文件的地址

在bootstrap.yml添加如下参数

#  函数库地址 在 vm optionis中 配置#  windows地址: -Djava.library.path=D:\software\opencv\build\java\x64#  linux地址:   -Djava.library.path=/usr/local/opencv-4.1.1/build/lib/opencv:  lib:    linuxxmlpath: /usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml    windowxmlpath: D:\software\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml

测试的方法中就直接写死了

     static CascadeClassifier faceDetector;    static {        String systemProperties = String.valueOf(System.getProperties());        log.info(systemProperties);        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);        faceDetector = new CascadeClassifier("D:\\software\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");    }

注意路径!!

关键点3:配置opencv的库文件地址

springboot集成opencv如何实现人脸识别功能

-Djava.library.path=D:\software\opencv\build\java\x64

这里其实指向的就是 该目录下的 opencv_java411.dll 文件
(linux的配置见下文)

代码

测试方法

package com.example.opencvdemo.test;import lombok.extern.slf4j.Slf4j;import org.opencv.core.*;import org.opencv.highgui.HighGui;import org.opencv.imGCodecs.Imgcodecs;import org.opencv.imgproc.Imgproc;import org.opencv.objdetect.CascadeClassifier;@Slf4jpublic class FaceVideo {        static CascadeClassifier faceDetector;    static {        String systemProperties = String.valueOf(System.getProperties());        log.info(systemProperties);        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);        faceDetector = new CascadeClassifier("D:\\software\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");    }    public static void main(String[] args){        // 3- 本地图片人脸识别,识别成功并保存人脸图片到本地        String imgPath = "C:\\Users\\Administrator\\Pictures\\wang.jpg";        face(imgPath);    }        public static void face(String imgPath) {                Mat image = Imgcodecs.imread(imgPath);        if (image.empty()) {            System.out.println("image 内容不存在!");            return;        }        // 3 特征匹配        MatOfRect face = new MatOfRect();        faceDetector.detectMultiScale(image, face);        // 4 匹配 Rect 矩阵 数组        Rect[] rects = face.toArray();        System.out.println("匹配到 " + rects.length + " 个人脸");        // 5 为每张识别到的人脸画一个圈        int i = 1;        for (Rect rect : face.toArray()) {            Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),                    new Scalar(0, 255, 0), 3);            imageCut(imgPath, "D:\\pictures\\" + i + ".jpg", rect.x, rect.y, rect.width, rect.height);// 进行图片裁剪            i++;        }        // 6 展示图片        HighGui.imshow("人脸识别", image);        HighGui.waiTKEy(0);    }        public static void imageCut(String imagePath, String outFile, int posX, int posY, int width, int height) {        // 原始图像        Mat image = Imgcodecs.imread(imagePath);        // 截取的区域:参数,坐标X,坐标Y,截图宽度,截图长度        Rect rect = new Rect(posX, posY, width, height);        // 两句效果一样        Mat sub = image.submat(rect); // Mat sub = new Mat(image,rect);        Mat mat = new Mat();        Size size = new Size(width, height);        Imgproc.resize(sub, mat, size);// 将人脸进行截图并保存        Imgcodecs.imwrite(outFile, mat);        System.out.println(String.fORMat("图片裁切成功,裁切后图片文件为: %s", outFile));    }}

注意!Mat image = Imgcodecs.imread(imgPath);
imgPath中不能带有中文!
opencv安装路径中如果有中文的话就会报错。

集成到springboot

package com.example.opencvdemo.util;import com.example.opencvdemo.exception.PublicException;import com.example.opencvdemo.result.ErrorCode;import com.Google.common.primitives.Bytes;import lombok.extern.slf4j.Slf4j;import org.opencv.core.*;import org.opencv.imgcodecs.Imgcodecs;import org.opencv.objdetect.CascadeClassifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;import java.io.*;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.List;@Component@Slf4jpublic class OpenCvUtils implements CommandLineRunner {    @Value("${opencv.lib.linuxxmlpath}")    private String linuxXmlPath;    @Value("${opencv.lib.windowxmlpath}")    private String windowXmlPath;        static CascadeClassifier faceDetector;        private static final boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("win");        public static void checkFace(String pictureUrl) throws Exception {//        //将在线图片保存为本地图片//        String imgPath = saveLocal(pictureUrl);//        //本地图片//        File file  = new File(imgPath);//        FileInputStream fileInputStream = new FileInputStream(file);//        ByteArrayOutputStream out = new ByteArrayOutputStream();//        byte[] localBuff = new byte[fileInputStream.available()];//        fileInputStream.read(localBuff);//        out.write(localBuff);//        log.info("本地图片:"+localBuff.length);        //在线图片        URL url = new URL(pictureUrl);        URLConnection uc = url.openConnection();        InputStream inputStream = uc.getInputStream();        ByteArrayOutputStream swapStream = new ByteArrayOutputStream();        byte[] buff = new byte[1024];        int rc;        while ((rc = inputStream.read(buff, 0, 1024)) > 0) {            swapStream.write(buff, 0, rc);        }        byte[] urlBuff = swapStream.toByteArray();        log.info("在线图片:"+urlBuff.length);        List<Byte> bs = new ArrayList<>();        bs.addAll(Bytes.asList(urlBuff));        log.info("buffer长度"+bs.size());        //        Mat image =  Converters.vector_char_to_Mat(bs);//        Mat image  =  Converters.vector_uchar_to_Mat(bs);        //        Mat image = Imgcodecs.imread(imgPath);                Mat image  = Imgcodecs.imdecode(new MatOfByte(urlBuff), Imgcodecs.IMREAD_UNCHANGED);        if (image.empty()) {            log.error("image 内容不存在!");            return;        }        // 3 特征匹配        MatOfRect face = new MatOfRect();        faceDetector.detectMultiScale(image, face);        // 4 匹配 Rect 矩阵 数组        Rect[] rects = face.toArray();        System.out.println("匹配到 " + rects.length + " 个人脸");//        delFile(imgPath);        if (rects.length == 0) {            throw new PublicException(ErrorCode.A0430.getCode(), "没有监测到人脸");        } else if (rects.length > 1) {            throw new PublicException(ErrorCode.A0430.getCode(), "检测到图片有多张人脸,请重新上传");        }    }    public static String saveLocal(String pictureUrl) throws IOException {        URL url = new URL(pictureUrl);        URLConnection uc = url.openConnection();        InputStream inputStream = uc.getInputStream();        String[] value = pictureUrl.split("/");        String firstFilePath = "D:\\pictures\\";        if (!IS_WINDOWS) {            firstFilePath = "/tmp/tmp-picture/";        }        String fileName = firstFilePath + value[value.length - 1];        FileOutputStream out = new FileOutputStream(fileName);        int j = 0;        while ((j = inputStream.read()) != -1) {            out.write(j);        }        inputStream.close();        return fileName;    }        @Override    public void run(String... args){        String systemProperties = String.valueOf(System.getProperties());        log.info(systemProperties);        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);        String path = "";        //如果是window系统取出路径开头的/        if (IS_WINDOWS) {            path = windowXmlPath;        }else{            path = linuxXmlPath;        }                faceDetector = new CascadeClassifier(path);        log.info("==========初始化人脸探测器成功===========");    }}

OpenCV 提供的 api 是直接根据路径读取图片的,所以最开始的时候我是把图片保存到本地在读取才成功的,但是这种方式太憨了点,在实际生产环境中,大部分情况下都是直接读取网络图片。在内存就完成图片和 opencv 的 Mat 对象的转换。这里代码中已经解决了url地址图片转化的问题。
这里附上解决该问题的博客 传送门

Linux安装opencv

Linux平台须要咱们手动编译,下载opencv-4.1.1.zip,解压到/user/local目录下,而后编译

yum  install   ant    gcc  gtk2-devel   pkgconfig  zlib-devel

安装unzip命令

yum install -y unzip zip

解压命令

unzip opencv-4.1.1.zip
yum   groupinstall "Development Tools"

安装cmake

查看cmake当前版本

cmake --version
yum -y install wget

下载获得cmake-3.9.2源码

wget Https://cmake.org/files/v3.9/cmake-3.9.2.tar.gz

解压、安装新版本

tar -xvf cmake-3.9.2.tar.gzcd cmake-3.9.2./configuresudo make && make install
cd /usr/local/opencv-4.1.1mkdir buildcd buildcmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF ..make -j8sudo make install

对应的jar和.so文件在

/usr/local/share/java/opencv4/

springboot集成opencv如何实现人脸识别功能

人脸识别特征XML文件的地址

/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml

Linux启动

jar 启动命令添加Vm options

nohup java -jar -Djava.library.path=/usr/local/opencv-4.1.1/build/lib/ opencv-demo-1.0.jar  > logs/opencv-demo-1.0.log 2>&1 &

GitHub直接白嫖

项目代码已上传至github,可通过WEB接口测试,也可用main方法测试。

以上是“springboot集成opencv如何实现人脸识别功能”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: springboot集成opencv如何实现人脸识别功能

本文链接: https://www.lsjlt.com/news/279937.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot集成opencv如何实现人脸识别功能
    这篇文章主要介绍springboot集成opencv如何实现人脸识别功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言项目中检测人脸图片是否合法的功能,之前用的是百度的人脸识别接口,由于成本高昂不得不寻求替代方案...
    99+
    2023-06-15
  • springboot集成opencv实现人脸识别功能的详细步骤
    目录前言什么是opencv?项目集成步骤准备工作代码Linux安装opencvLinux启动github直接白嫖前言 项目中检测人脸图片是否合法的功能,之前用的是百度的人脸识别接口,...
    99+
    2022-11-12
  • java+opencv实现人脸识别功能
    背景:最近需要用到人脸识别,但又不花钱使用现有的第三方人脸识别接口,为此使用opencv结合java进行人脸识别(ps:opencv是开源的,使用它来做人脸识别存在一定的误差,效果一...
    99+
    2022-11-12
  • java+opencv如何实现人脸识别功能
    这篇文章主要介绍了java+opencv如何实现人脸识别功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向...
    99+
    2023-06-15
  • 如何基于SpringBoot实现人脸识别功能
    目录前言需求分析一、人脸注册二、人脸登录具体实现一、人脸注册二、刷脸登录总结前言 去年在公司参与了一个某某机场建设智能机场的一个项目,人脸登机是其中的一个功能模块,当时只是写了后台的...
    99+
    2022-11-13
  • SpringBoot集成百度AI实现人脸识别的项目实践
    目录1. 百度AI开放平台2. 文档集成3. 代码实现3.1 创建SpringBoot工程3.2 添加百度AI依赖3.3 创建AipFace3.4 注册人脸接口3.5 人脸登录接口3...
    99+
    2022-11-13
  • Android基于opencv4.6.0实现人脸识别功能
    前言 步骤: 整合opencv 获取相机的SurfaceView传到native层去检测(亦或是不断的获取SurfaceView的Bitmap,传到native层) 检测人脸,在本地保存人脸特征信息 4.上传至后台(不实现) 人脸识别实现的...
    99+
    2023-09-30
    android android studio opencv
  • uniapp app人脸识别功能怎么实现
    这篇文章主要介绍“uniapp app人脸识别功能怎么实现”,在日常操作中,相信很多人在uniapp app人脸识别功能怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”uniapp&...
    99+
    2023-06-30
  • uniapp实现人脸识别功能详细示例
    微信小程序实现人脸识别,具体应用场景   前端实现人脸信息采集  拍到正面照片  发送给后端 该方法暂时只针对微信小程序 前端具体效果展示 如...
    99+
    2022-11-13
    uniapp人脸识别功能 uniapp 人脸识别 uniapp 人脸识别 小程序
  • Python 40行代码实现人脸识别功能
    前言 很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了。这些人里包括曾经的我自己。其实如果如果你不是非要深究其中的原理,只是要实现这一工作...
    99+
    2022-06-04
    代码 功能 Python
  • java人脸识别考勤功能怎么实现
    Java人脸识别考勤功能的实现需要以下步骤:1.采集人脸数据:使用摄像头或者照片采集人脸数据,保存到数据库中。2.预处理人脸数据:对...
    99+
    2023-05-30
    java人脸识别 java
  • 如何使用Python实现简单的人脸识别功能
    小编给大家分享一下如何使用Python实现简单的人脸识别功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、首先梳理一下实现人脸识别需要进行的步骤:流程大致如此...
    99+
    2023-06-14
  • 基于Python的人脸识别功能怎么实现
    这篇文章主要介绍“基于Python的人脸识别功能怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python的人脸识别功能怎么实现”文章能帮助大家解决问题。一、 人脸检测人脸检测是指从图像...
    99+
    2023-07-05
  • 手把手教你利用opencv实现人脸识别功能(附源码+文档)
    目录一、环境二、使用Haar级联进行人脸检测三、Haar级联结合摄像头四、使用SSD的人脸检测五、 SSD结合摄像头人脸检测六、结语一、环境 pip install opencv...
    99+
    2022-11-12
  • uniapp实现人脸识别功能的具体实现代码
    目录前言问题解决办法详细实现思路具体代码总结前言 对于前端来说,需要后端提供一个人脸识别接口,前端传入图片,接口识别并返回结果,如此看来,其实前端只需实现图片传入即可,但是其实不然,...
    99+
    2022-12-08
    uniapp 人脸识别 uniapp小程序人脸识别 uniapp人脸识别功能
  • 基于Python实现人脸识别和焦点人物检测功能
    写在前面的话 基于dlib库的模型,实现人脸识别和焦点人物的检测。最后呈现的效果为焦点人物的识别框颜色与其他人物框不一样。 准备工作 需要安装好python环境,安装好dlib、o...
    99+
    2022-11-12
  • 基于face_recognition如何实现人脸识别
    这篇文章将为大家详细讲解有关基于face_recognition如何实现人脸识别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。准备工作我们的人脸识别基于face_recognition库。f...
    99+
    2023-06-17
  • Python如何实现人脸识别系统
    小编给大家分享一下Python如何实现人脸识别系统,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!基本原理人脸识别和目标检测这些还不太一样,比如大家传统的训练一个目...
    99+
    2023-06-26
  • 怎样使用Python实现简单的人脸识别功能
    这篇文章给大家分享的是有关怎样使用Python实现简单的人脸识别功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、首先梳理一下实现人脸识别需要进行的步骤:流程大致如此,在此之前,要先让人脸被准确的找出来,也就...
    99+
    2023-06-25
  • 智能安防监控:基于Java+SpringBoot实现人脸识别搜索
    目录 引言背景介绍目的和重要性 人脸识别技术的基本原理图像采集和预处理特征提取与表示人脸匹配算法 人脸识别搜索的应用领域公告安全和监控社交网络和照片管理 参考实现步骤数据收集与预处理人脸特征提取查询处理 引言 ...
    99+
    2023-08-16
    java spring boot 开发语言 AI 人脸搜索 人脸识别
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作