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

  1. 安装opencv
    官网地址:https://opencv.org/, 由于官网下载速度是真的慢
    为此这边是我下的百度云盘,opencv4.1.0,提取码1o36。
    如果是官网下载,就无脑安装就行了,安装完毕后。

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


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

  1. 在项目中引入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的项目。


    选择直接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;/*** 人脸比对工具类* @author Litluecat* @Title: Opencv 图片人脸识别、实时摄像头人脸识别
**/
public class FaceVideo {private static final Logger log = LoggerFactory.getLogger(FaceVideo.class);private static final String endImgUrl = "C:\\Users\\lenovo\\Desktop\\";/*** opencv的人脸识别xml文件路径*/private static final String faceDetectorXML2URL = "D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";/*** opencv的人眼识别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.png");//仅用于强制抛异常,从而关闭GUI界面Thread.sleep(1000);int err = 1/0;// 2- 比对本地2张图的人脸相似度 (越接近1越相似)
//            double compareHist = FaceVideo.compare_image(endImgUrl + "test1.png" , endImgUrl + "face.png");
//            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);}}/*** OpenCV-4.1.1 从摄像头实时读取* @param targetImgUrl 比对身份证图片* @return: void* @date: 2019年8月19日 17:20:13*/public static void getVideoFromCamera(String targetImgUrl) {//1 如果要从摄像头获取视频 则要在 VideoCapture 的构造方法写 0VideoCapture 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;}/*** OpenCV-4.1.0 人脸识别* @param image 待处理Mat图片(视频中的某一帧)* @param targetImgUrl 匹配身份证照片地址* @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.png", image);FaceVideoThread faceVideoThread = new FaceVideoThread(targetImgUrl , endImgUrl + "face.png");new Thread(faceVideoThread,"人脸比对线程").start();}}return image;}/*** 人脸截图* @param img* @return*/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;}/*** 人脸比对* @param img_1* @param img_2* @return*/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;}/*** 灰度化人脸* @param img* @return*/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;}@Overridepublic 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实现人脸识别相关推荐

  1. Java + opencv 实现人脸识别,图片人脸识别、视频人脸识别、摄像头实时人脸识别

    搭建环境 opencv官网下载windows安装包 https://opencv.org/releases/ 选择最新版4.1.1 下载完成后是一个opencv-4.1.1-vc14_vc15.exe ...

  2. Java使用OpenCV实现人脸识别

    通过OpenCV实现人脸识别,包括图片,视频,摄像头中人脸识别. 首先看一下效果(在网上随便找的一张图片): 下面开始说一下如何实现的: 第一步:  需要安装OpenCV 下载链接:https://o ...

  3. java调起本地摄像头,利用openCV进行人脸识别(一)

    嗨咯,又好久没有更新了.今天写个前阵子做的人脸识别程序.该程序客户端基于Jave JFrame 客户端的主要作用是,调用电脑的摄像头(我的直接调用笔记本摄像头),然后回显摄像头录取的信息,再利用ope ...

  4. Java借助OpenCV实现人脸识别登录完整示例

    Java借助OpenCV实现人脸识别登录完整示例 OpenCV 效果预览 概述 下载与安装 目录说明 OpenCV的基本使用 项目集成 图片人脸检测 人脸对比相似度 识别视频中的人脸 摄像头识别人脸 ...

  5. 基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

  6. Python基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

  7. 强!一个Java开发的人脸识别系统,获取人脸68个关键点(附源码)

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料视频 点击此链接:多套SpringCloud/SpringBoot实 ...

  8. Android之OpenCv简单人脸识别功能(Bitmap)

    Android之OpenCv简单人脸识别功能 OpenCv的下载 下载地址 - https://opencv.org/releases/ doc 文档目录 samples 示例代码 sdk 编译后的动 ...

  9. 怎样使用OpenCV进行人脸识别

    不断维护的地址:http://plzcoding.com/face-recognition-with-opencv/ 怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Re ...

  10. python使用opencv实现人脸识别系统

    1.首先安装过python环境,在这里就不过说    检测是否安装成功如下,在cmd中输入Python     2.安装numpy 现在开始安装numpy,打开cmd,输入pip install nu ...

最新文章

  1. bitset优化+滚动优化dp ----- 2021牛客多校第8场 F Robot
  2. 求m ,n 两个数的最小公倍数
  3. rust(47)-key-value哈希-HashMap,BTreeMap,HashSet,BTreeSet
  4. u大师u盘装系统win7_优盘如何装系统 u盘装系统的步骤
  5. Java关键字(53个关键字)
  6. Python黑客编程3网络数据监听和过滤
  7. 《设计模式解析(第2版•修订版)》—第1章 1.4节应对变化:使用功能分解
  8. Microsoft Visual Studio Team Foundation Server Express 2013 (一) 服务器端安装和配置
  9. js对特殊字符转义、时间格式化、获取URL参数
  10. 抖音自动上号源码分享
  11. 如何在window和mac共用一个移动硬盘
  12. TP-LINK 路由器 无线桥接 设置
  13. MYS-6ULX-IOT 开发板测评——使用 Yocto 添加软件包
  14. nginx日志统计pv、uv命令
  15. uoj311 【UNR #2】积劳成疾
  16. 十大排序算法详解(二)归并排序、堆排序、计数排序、桶排序、基数排序
  17. UI设计中的排版方法
  18. Oracle JDK高版本商用付费分析
  19. 【74HC595芯片】核心驱动代码
  20. 东航航空货运系统技术解析(二)配置服务端与新建界面层

热门文章

  1. Python设计模式:适配器模式
  2. Android TV框架TIF
  3. 区块链技术指南学习(三)转型之擎
  4. 手把手教你win10下lex与yacc的安装
  5. 房地产软件信息化——CRM的“中海模式”穆利堂-movno1
  6. TDH 更新Inceptor UDF步骤
  7. H3C IPsec穿越nat实验
  8. C语言编写的爱心代码
  9. c语言程序的书写格式,C语言基础教程:C语言程序书写格式
  10. Web表单设计:点石成金的艺术(美)罗博乌斯基pdf