Java中怎么使用opencv开发人脸识别功能
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,今天小编给大家分享一下Java中怎么使用opencv开发人脸识别功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收
千家信息网最后更新 2025年11月14日Java中怎么使用opencv开发人脸识别功能
今天小编给大家分享一下Java中怎么使用opencv开发人脸识别功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
背景:最近需要用到人脸识别,但又不花钱使用现有的第三方人脸识别接口,为此使用opencv结合java进行人脸识别(ps:opencv是开源的,使用它来做人脸识别存在一定的误差,效果一般)。
1.安装opencv
如果是官网下载,就无脑安装就行了,安装完毕后。
2.在项目中引入pom依赖
org.bytedeco.javacpp-presets ffmpeg 4.1-1.4.4 org.bytedeco javacv 1.4.4 org.bytedeco.javacpp-presets ffmpeg-platform 4.1-1.4.4 org.bytedeco javacv-platform 1.4.4 org.bytedeco.javacpp-presets opencv-platform 4.0.1-1.4.4 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.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); } } /** * OpenCV-4.1.1 从摄像头实时读取 * @param targetImgUrl 比对身份证图片 * @return: void * @date: 2019年8月19日 17:20:13 */ 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; } /** * 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.jpg", image); FaceVideoThread faceVideoThread = new FaceVideoThread(targetImgUrl , endImgUrl + "face.jpg"); 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; } @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:Sofewareopencvuildjavax64;
以上就是"Java中怎么使用opencv开发人脸识别功能"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
人脸
图片
探测
参数
摄像头
知识
篇文章
摄像
人眼
大小
实时
灰度
范围
路径
功能
开发
相似
成功
代码
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
阿里云邮箱的收件服务器
5e无法进入安全服务器
烽火服务器管理口重装系统
网络安全法看点
兰州三维互联网科技公司
恒玄科技和小米互联网
河南正规软件开发哪家实惠
做云服务器托管前景怎样
互联网黑科技代理
高并发数据库效果图
山东专业直销软件开发
网络安全waf
浙江基础网络技术诚信为本
软件开发银行外包要不要做
软件开发吴老师
杭州掌玩网络技术公司
网络安全尹鹏
上海高磊软件开发公司
软件开发硬件环境官方完整版
使网络安全()
新浪smtp服务器地址
dc服务器证书
有哪些数据库模型
二本比较好的软件开发大学
今日关注网络安全
中国银行数据库管理
网络安全大会2021冯琳
校园网络安全的原创表语
135系统有服务器吗
登录服务器无响应