iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java+opencv实现人脸识别功能
  • 146
分享到

java+opencv实现人脸识别功能

2024-04-02 19:04:59 146人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

背景:最近需要用到人脸识别,但又不花钱使用现有的第三方人脸识别接口,为此使用OpenCV结合java进行人脸识别(ps:opencv是开源的,使用它来做人脸识别存在一定的误差,效果一

背景:最近需要用到人脸识别,但又不花钱使用现有的第三方人脸识别接口,为此使用OpenCV结合java进行人脸识别(ps:opencv是开源的,使用它来做人脸识别存在一定的误差,效果一般)。

1.安装opencv
官网地址:https://opencv.org/ , 由于官网下载速度是真的慢

百度网盘:

链接: Https://pan.baidu.com/s/1RpsP-I7v8pP2dkqALDw7FQ

提取码: pq7v

如果是官网下载,就无脑安装就行了,安装完毕后。

将图一的两个文件复制到图二中。

在这里插入图片描述
在这里插入图片描述

从我网盘下载的,忽略这些。

2.在项目中引入pom依赖


<!-- opencv + javacv + FFmpeg-->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg</artifactId>
            <version>4.1-1.4.4</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.4.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/ffmpeg-platfORM -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg-platform</artifactId>
            <version>4.1-1.4.4</version>
        </dependency>

        <!-- 视频摄像头 -->
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.4.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>opencv-platform</artifactId>
            <version>4.0.1-1.4.4</version>
        </dependency>

1.导入库依赖
File --> Project Structure,点击Modules,选择需要使用opencv.jar的项目。

dWVyQ2F0,size_16,color_FFFFFF,t_70#pic_center)
在这里插入图片描述

选择直接opencv安装路径

在这里插入图片描述
在这里插入图片描述

2.java代码demo


package org.Litluecat.utils;

import org.apache.commons.lang.StringUtils;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.highgui.ImageWindow;
import org.opencv.imGCodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.VideoWriter;
import org.opencv.videoio.Videoio;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;


public class FaceVideo {

    private static final Logger log = LoggerFactory.getLogger(FaceVideo.class);

    private static final String endImgUrl = "C:\\Users\\lenovo\\Desktop\\";
    
    private static final String faceDetectorXML2URL = "D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
    
    private static final String eyeDetectorXML2URL = "D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml";
    
    private static int Matching_Accuracy = 100000;
    
    private static CascadeClassifier faceDetector;
    
    private static CascadeClassifier eyeDetector;

    private static int i=0;

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        faceDetector = new CascadeClassifier(faceDetectorXML2URL);
        eyeDetector = new CascadeClassifier(eyeDetectorXML2URL);
    }

    public static void main(String[] args) {
        log.info("开始人脸匹配");
        long begin = System.currentTimeMillis();
        // 1- 从摄像头实时人脸识别,识别成功保存图片到本地
        try{
            getVideoFromCamera(endImgUrl + "2.jpg");
            //仅用于强制抛异常,从而关闭GUI界面
            Thread.sleep(1000);
            int err = 1/0;
     
            // 2- 比对本地2张图的人脸相似度 (越接近1越相似)
//            double compareHist = FaceVideo.compare_image(endImgUrl + "test1.jpg" , endImgUrl + "face.jpg");
//            log.info("匹配度:{}",compareHist);
//            if (compareHist > 0.72) {
//                log.info("人脸匹配");
//            } else {
//                log.info("人脸不匹配");
//            }

        }catch (Exception e){
            log.info("开始强制关闭");
            log.info("人脸匹配结束,总耗时:{}ms",(System.currentTimeMillis()-begin));
            System.exit(0);
        }
    }


    
    public static void getVideoFromCamera(String targetImgUrl) {
        //1 如果要从摄像头获取视频 则要在 VideoCapture 的构造方法写 0
        VideoCapture capture = new VideoCapture(0);
        Mat video = new Mat();
        int index = 0;
        if (capture.isOpened()) {
            while(i<3) {
                // 匹配成功3次退出
                capture.read(video);
                HighGui.imshow("实时人脸识别", getFace(video, targetImgUrl));
                //窗口延迟等待100ms,返回退出按键
                index = HighGui.waiTKEy(100);
                //当退出按键为Esc时,退出窗口
                if (index == 27) {
                    break;
                }
            }
        }else{
            log.info("摄像头未开启");
        }
        //该窗口销毁不生效,该方法存在问题
        HighGui.destroyAllwindows();
        capture.release();
        return;
    }

    
    public static Mat getFace(Mat image, String targetImgUrl) {
        MatOfRect face = new MatOfRect();
        faceDetector.detectMultiScale(image, face);
        Rect[] rects=face.toArray();
        log.info("匹配到 "+rects.length+" 个人脸");
        if(rects != null && rects.length >= 1) {
            i++;
            if(i==3) {
                // 获取匹配成功第3次的照片
                Imgcodecs.imwrite(endImgUrl + "face.jpg", image);
                FaceVideoThread faceVideoThread = new FaceVideoThread(targetImgUrl , endImgUrl + "face.jpg");
                new Thread(faceVideoThread,"人脸比对线程").start();
            }
        }
        return image;
    }

    
    public static String face2Img(String img) {
        String faceImg = null;
        Mat image0 = Imgcodecs.imread(img);
        Mat image1 = new Mat();
        // 灰度化
        Imgproc.cvtColor(image0, image1, Imgproc.COLOR_BGR2GRAY);
        // 探测人脸
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(image1, faceDetections);
        // rect中人脸图片的范围
        for (Rect rect : faceDetections.toArray()) {
            faceImg = img+"_.jpg";
            // 进行图片裁剪
            imageCut(img, faceImg, rect.x, rect.y, rect.width, rect.height);
        }
        if(null == faceImg){
            log.info("face2Img未识别出该图像中的人脸,img={}",img);
        }
        return faceImg;
    }

    
    public static double compare_image(String img_1, String img_2) {
        Mat mat_1 = conv_Mat(img_1);
        Mat mat_2 = conv_Mat(img_2);
        Mat hist_1 = new Mat();
        Mat hist_2 = new Mat();

        //颜色范围
        MatOfFloat ranges = new MatOfFloat(0f, 256f);
        //直方图大小, 越大匹配越精确 (越慢)
        MatOfInt histSize = new MatOfInt(Matching_Accuracy);

        Imgproc.calcHist(Arrays.asList(mat_1), new MatOfInt(0), new Mat(), hist_1, histSize, ranges);
        Imgproc.calcHist(Arrays.asList(mat_2), new MatOfInt(0), new Mat(), hist_2, histSize, ranges);

        // CORREL 相关系数
        double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL);
        return res;
    }

    
    public static Mat conv_Mat(String img) {
        if(StringUtils.isBlank(img)){
            return null;
        }
        Mat image0 = Imgcodecs.imread(img);
        Mat image1 = new Mat();
        //Mat image2 = new Mat();
        // 灰度化
        Imgproc.cvtColor(image0, image1, Imgproc.COLOR_BGR2GRAY);
        //直方均匀
        //Imgproc.equalizeHist(image1, image2);

        // 探测人脸
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(image1, faceDetections);

        //探测人眼
//        MatOfRect eyeDetections = new MatOfRect();
//        eyeDetector.detectMultiScale(image1, eyeDetections);

        // rect中人脸图片的范围
        Mat face = null;
        for (Rect rect : faceDetections.toArray()) {

            //给图片上画框框 参数1是图片 参数2是矩形 参数3是颜色 参数四是画出来的线条大小
            //Imgproc.rectangle(image0,rect,new Scalar(0,0,255),2);
            //输出图片
            //Imgcodecs.imwrite(img+"_.jpg",image0);

            face = new Mat(image1, rect);
        }
        if(null == face){
            log.info("conv_Mat未识别出该图像中的人脸,img={}",img);
        }
        return face;
    }

}

这边的人脸识别是另外其线程进行比对,代码如下。


package org.Litluecat.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class FaceVideoThread implements Runnable{
    private static final Logger log = LoggerFactory.getLogger(FaceVideoThread.class);

    private String oneImgUrl = null;
    private String otherImgUrl = null;
    public FaceVideoThread(String oneImgUrl, String otherImgUrl){
        this.oneImgUrl = oneImgUrl;
        this.otherImgUrl = otherImgUrl;
    }
    @Override
    public void run() {
        try {
            double compareHist = FaceVideo.compare_image(oneImgUrl , otherImgUrl);
            log.info("匹配度:{}",compareHist);
            if (compareHist > 0.72) {
                log.info("人脸匹配");
            } else {
                log.info("人脸不匹配");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

提醒:如果运行异常,请添加你opencv的安装地址-Djava.library.path=D:\Sofeware\opencv\build\java\x64;

在这里插入图片描述

总结:java+opencv做人脸识别的精度不够,我也是有待学习,如果大家有更好的方式,能将opencv更好的展现出来,并达到更精准的人脸识别,请分享给我,谢谢。

到此这篇关于java+opencv实现人脸识别的文章就介绍到这了,更多相关java opencv人脸识别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: java+opencv实现人脸识别功能

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

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

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

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

下载Word文档
猜你喜欢
  • java+opencv实现人脸识别功能
    背景:最近需要用到人脸识别,但又不花钱使用现有的第三方人脸识别接口,为此使用opencv结合java进行人脸识别(ps:opencv是开源的,使用它来做人脸识别存在一定的误差,效果一...
    99+
    2022-11-12
  • java+opencv如何实现人脸识别功能
    这篇文章主要介绍了java+opencv如何实现人脸识别功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向...
    99+
    2023-06-15
  • OpenCV实现人脸识别
    主要有以下步骤: 1、人脸检测 2、人脸预处理 3、从收集的人脸训练机器学习算法 4、人脸识别 5、收尾工作 人脸检测算法: 基于Haar的脸部检测器的基本思想是,对于面部正面大部分区域而言,会有眼睛所在区...
    99+
    2022-06-04
    OpenCV
  • 人脸识别实战之Opencv+SVM实现人脸识别
    目录前言项目结构编码训练人脸识别模型识别图像中的人脸摄像头识别人脸前言 在本文中,您将学习如何使用 OpenCV 进行人脸识别。文章分三部分介绍: 第一,将首先执行人脸检测,使用深度...
    99+
    2022-11-12
  • springboot集成opencv如何实现人脸识别功能
    这篇文章主要介绍springboot集成opencv如何实现人脸识别功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言项目中检测人脸图片是否合法的功能,之前用的是百度的人脸识别接口,由于成本高昂不得不寻求替代方案...
    99+
    2023-06-15
  • Java OpenCV实现人脸识别过程详解
    人脸识别是计算机视觉中的一个重要应用领域,OpenCV 是一个开源的计算机视觉库,提供了许多用于人脸识别的功能。下面是使用 Java...
    99+
    2023-09-16
    java
  • Java+OpenCV实现图片中的人脸识别
    目录MatOfRect.detectMultiScale函数实现代码ImageViewer.javaDetectFace.java运行把识别出来的脸存成文件经过前三个教程,我们可以知...
    99+
    2022-11-13
  • 【ROS】OpenCV+ROS 实现人脸识别(Ubantu16.04)
    目录   前言 一、环境配置   1.安装ROS  2.摄像头调用 3.导入OpenCV 二、创建工作空间和功能包 1.创建工作空间 2.创建功能包 三、人脸识别检测相关代码 1.python文件 2.lanuch文件  3.CvBridg...
    99+
    2023-08-31
    opencv linux 人工智能 python 学习
  • Opencv+SVM怎样实现人脸识别
    Opencv+SVM怎样实现人脸识别,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言如何使用 OpenCV 进行人脸识别。第一,将首先执行人脸检测,使用深度学习从每个人脸...
    99+
    2023-06-22
  • java人脸识别考勤功能怎么实现
    Java人脸识别考勤功能的实现需要以下步骤:1.采集人脸数据:使用摄像头或者照片采集人脸数据,保存到数据库中。2.预处理人脸数据:对...
    99+
    2023-05-30
    java人脸识别 java
  • springboot集成opencv实现人脸识别功能的详细步骤
    目录前言什么是opencv?项目集成步骤准备工作代码Linux安装opencvLinux启动github直接白嫖前言 项目中检测人脸图片是否合法的功能,之前用的是百度的人脸识别接口,...
    99+
    2022-11-12
  • 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
  • Java和OpenCV怎么实现图片中的人脸识别
    要在Java中实现人脸识别,可以使用OpenCV库。以下是一个基本的示例代码:```javaimport org.opencv.co...
    99+
    2023-08-18
    Java OpenCV
  • 基于python3+OpenCV实现人脸和眼睛识别
    基于python3+OpenCV的人脸和眼睛识别,供大家参考,具体内容如下 一、OpenCV人脸检测的xml文件下载 人脸检测和眼睛检测要用到haarcascade_eye.xml和...
    99+
    2022-11-12
  • Python中基于Opencv怎么实现人脸识别
    这篇文章主要讲解了“Python中基于Opencv怎么实现人脸识别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中基于Opencv怎么实现人脸识别”吧!检测人脸。这应该是最基本的...
    99+
    2023-06-02
  • uniapp实现人脸识别功能详细示例
    微信小程序实现人脸识别,具体应用场景   前端实现人脸信息采集  拍到正面照片  发送给后端 该方法暂时只针对微信小程序 前端具体效果展示 如...
    99+
    2022-11-13
    uniapp人脸识别功能 uniapp 人脸识别 uniapp 人脸识别 小程序
  • Python 40行代码实现人脸识别功能
    前言 很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了。这些人里包括曾经的我自己。其实如果如果你不是非要深究其中的原理,只是要实现这一工作...
    99+
    2022-06-04
    代码 功能 Python
  • 如何基于SpringBoot实现人脸识别功能
    目录前言需求分析一、人脸注册二、人脸登录具体实现一、人脸注册二、刷脸登录总结前言 去年在公司参与了一个某某机场建设智能机场的一个项目,人脸登机是其中的一个功能模块,当时只是写了后台的...
    99+
    2022-11-13
  • Python实现人脸识别
    使用到的库: dlib+Opencv python版本: 3.8 编译环境: Jupyter Notebook (Anaconda3) 0.Dlib人脸特征检测原理 提取特征点:首选...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作