Java+opencv+mysql实现人脸识别源码(人脸采集入库+人脸识别相似度)

article/2025/7/13 1:47:43

Java+opencv实现人脸识别

写这篇博客,是因为以前经常使用python+opencv实现人脸处理,后来发现java也可以实现,于是便学习了下,以下将代码和实现过程贴出。

目录

1、环境准备

使用到的技术:java+opencv+mysql
我这里用的是opencv4.1,这里可以自行下载(其实只需要一个opencv的dll文件放在java安装目录的bin下面既可)

2、代码实现

核心opencv人脸识别类(识别算法):

package com.dialect.utils;import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;import java.util.Arrays;/*** 1.  灰度化(减小图片大小)* 2. 人脸识别* 3. 人脸切割* 4. 规一化(人脸直方图)* 5. 直方图相似度匹配*** @Description: 比较两张图片人脸的匹配度* @date 2019/2/1813:47*/
public class FaceCompare {// 初始化人脸探测器static CascadeClassifier faceDetector;static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);faceDetector = new CascadeClassifier("E:\\eclipseworkspace\\FaceDectcoSys\\src\\haarcascade_frontalface_default.xml");}// 灰度化人脸public static Mat conv_Mat(String img) {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()) {Mat face = new Mat(image1, rect);return face;}return null;}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(1000);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 void main(String[] args) {String basePicPath = "E:\\eclipseworkspace\\FaceDectcoSys\\WebContent\\static\\images\\";double compareHist = compare_image(basePicPath + "fbb1.jpg", basePicPath + "fbb2.jpg");System.out.println(compareHist);if (compareHist > 0.72) {System.out.println("人脸匹配");} else {System.out.println("人脸不匹配");}}
}

测试两张图片相似度(美女照片自己网上找):
在这里插入图片描述
在这里插入图片描述
测试结果:相似度0.82左右,还好了
在这里插入图片描述
接着实现网页

数据库dao:

package com.dialect.info.dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;import com.dialect.info.bean.Dect;/*** 人脸信息DAO接口* @author admin* @version 2020-05-10*/
public class DectDao {/*** 添加* @param con* @param Dialect* @return* @throws Exception*/public int add(Connection con,Dect dect)throws Exception{dect.setId(UUID.randomUUID().toString().replace("-", ""));String sql="insert into dect values(?,?)";PreparedStatement pstmt=con.prepareStatement(sql);pstmt.setString(1,dect.getId());pstmt.setString(2,dect.getBase64());return pstmt.executeUpdate();}/*** 查询所有* @param con* @param dialect* @return* @throws Exception*/public List<Dect> list(Connection con)throws Exception{List<Dect> list = new ArrayList<>();Dect entity=null;String sql = "select a.* from dect a";PreparedStatement pstmt=con.prepareStatement(sql);ResultSet rs=pstmt.executeQuery();while(rs.next()){entity = new Dect();entity.setId(rs.getString("id"));entity.setBase64(rs.getString("base64"));list.add(entity);}return list;}}

service层:

package com.dialect.info.service.impl;import java.sql.Connection;
import java.util.List;import com.dialect.info.bean.Dect;
import com.dialect.info.dao.DectDao;
import com.dialect.info.service.DectService;
import com.dialect.utils.DbUtil;
import com.dialect.utils.Page;/*** 人脸信息DAO接口* @author admin* @version 2020-05-10*/
public class DectServiceImpl  implements DectService  {DectDao dectDao = new DectDao();@Overridepublic int add(Dect dect) {try {Connection con = DbUtil.getCon();Integer result =dectDao.add(con, dect);DbUtil.closeCon(con);return result;} catch (Exception e) {e.printStackTrace();}return 0;}@Overridepublic List<Dect> select() {try {Connection con = DbUtil.getCon();List<Dect> list = dectDao.list(con);DbUtil.closeCon(con);return list;} catch (Exception e) {e.printStackTrace();}return null;}}

control控制层:

package com.dialect.info.controller;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import com.dialect.info.bean.Dect;
import com.dialect.info.dao.DectDao;
import com.dialect.info.service.DectService;
import com.dialect.info.service.impl.DectServiceImpl;
import com.dialect.utils.Page;
import com.dialect.utils.picToBase64;
import com.dialect.utils.FaceCompare; @WebServlet("/dect")
public class DectController extends HttpServlet {private static final long serialVersionUID = 1L;DectDao dectDao=new DectDao();DectService dectService = new DectServiceImpl();protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String method = request.getParameter("method");if ("upload".equals(method)) {upload(request,response);}else if ("select".equals(method)) {select(request, response);}else if ("list".equals(method)) {list(request, response);}else if ("form".equals(method)) {form(request, response);}}//添加private void upload(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.err.println("---开始上传---");String para = request.getParameter("base64");String s = para.replace("data:image/jpeg;base64,","");System.err.println(para);System.err.println(s);Dect dect = new Dect();dect.setBase64(s);int res = dectService.add(dect);//			System.err.println(res);//			String res = "1";
//			String res2 = "3";// 解决json中文乱码response.setContentType("text/json;charset=UTF-8");response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();
//	        String str ="{\"success\":"+res+",\"age\":"+res2 +"}";String str ="{\"success\":"+res+"}";out.println(str);out.flush();out.close();}//添加private void select(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.err.println("---进来了select方法---");FaceCompare faceCompare = new FaceCompare();String para = request.getParameter("base64");String s = para.replace("data:image/jpeg;base64,","");System.err.println(para);System.err.println(s);picToBase64 pic = new picToBase64();String imgPath1 = "E:\\eclipseworkspace\\FaceDectcoSys\\WebContent\\static\\images\\img1.jpg";String imgPath2 = "E:\\eclipseworkspace\\FaceDectcoSys\\WebContent\\static\\images\\img2.jpg";
//		String imgPath1 = "E:\\img1.jpg";
//		String imgPath2 = "E:\\img2.jpg";//String imgPath2 = "E:\\eclipseworkspace\\FaceDectcogSys\\WebContent\\static\\images\\img2";pic.Base64ToImage(s, imgPath1);List<Dect> list = dectService.select();int shibie_flag = 0;double res = 0;System.err.println(list.size());if (list.size()>0){for(Dect dect:list){System.err.println(dect.getBase64());String s1 = dect.getBase64().replace("data:image/jpeg;base64,","");System.err.println("s1:"+s1);picToBase64 pic2 = new picToBase64();pic2.Base64ToImage(s1, imgPath2);res = faceCompare.compare_image(imgPath1, imgPath2);if (res > 0.72){System.out.println("人脸匹配");shibie_flag = 1;break;}}}response.setContentType("text/json;charset=UTF-8");response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();String str ="{\"success\":"+shibie_flag+",\"res\":"+res +"}";
//        String str ="{\"success\":"+res+"}";out.println(str);out.flush();out.close();
//		response.sendRedirect(contextPath+"/dialect?method=list");}//列表查询private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.getRequestDispatcher("/dectList2.jsp").forward(request, response);}//form跳转页面private void form(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.getRequestDispatcher("/dectList3.jsp").forward(request, response);}}

3、运行效果

网站操作流程如下:
第一步:人脸采集(支持上传图片预览)
在这里插入图片描述
入库成功:
在这里插入图片描述
开始人脸识别(人脸匹配成功):
在这里插入图片描述

写在最后:因篇幅有限,不能讲所有代码贴出,如果遇到问题可以加博主V交流:Code2Life2


http://chatgpt.dhexx.cn/article/rnxqEfyX.shtml

相关文章

java人脸识别源码_用 Java 实现人脸识别功能(附源码)

整理了一些Java方面的架构、面试资料(微服务、集群、分布式、中间件等),有需要的小伙伴可以关注公众号【程序员内点事】,无套路自行领取 更多优选 引言 远程在家办公的第N天,快要闲出屁了,今天突然有个小学弟加我VX说要咨询我点技术问题(终于可以装X了)。 看了他的需求描述…

java实现人脸识别源码【含测试效果图】——前期准备工作及访问提示

注意&#xff1a; 看完之后如有不懂&#xff0c;请看&#xff1a;关于人脸和指纹识别共同交流方案&#xff0c;也可以关注微信公众号&#xff1a;雄雄的小课堂&#xff0c;回复&#xff1a;人脸识别群获取群号&#xff0c;群内有直接可以运行的源码可供下载&#xff0c;人脸识…

人脸识别2:InsightFace实现人脸识别Face Recognition(含源码下载)

人脸识别2&#xff1a;InsightFace实现人脸识别Face Recognition(含源码下载) 目录 人脸识别2&#xff1a;InsightFace实现人脸识别Face Recognition(含源码下载) 1. 前言 2. 项目安装 3. 人脸识别系统 &#xff08;1&#xff09;人脸检测和关键点检测 &#xff08;2&am…

Linux实现代码雨

黑客帝国大部分人都知道吧&#xff0c;屏幕前的绿条条看着挺炫酷的&#xff0c;平常接触Linux系统的&#xff0c;也得娱乐一下&#xff0c;看看这个效果怎么实现的吧&#xff01; 1&#xff0c;下载cmatrixcmatrix-1.2a.tar.gz 链接&#xff1a;工具包下载 提取码&#xff1a…

黑客代码雨

想必大家看电视的时候会有那种黑客使用的电脑都是一丢绿色的都是在哪一直动&#xff0c;接着黑客随便动一下就完成一个指令了&#xff0c;今天我就带大家实现这个效果。 看看效果图吧&#xff1a; 直接开始进入主题 先导入系统文件库 import pygame import random from pyga…

【黑客帝国-代码雨】超火(免费送)(17)

&#xff08;刚学的&#xff0c;还有好多地方做的不完善&#xff0c;后期继续跟进&#xff0c;直接复制代码&#xff0c;后缀名改为&#xff1a;.html &#xff0c;直接运行就可以看到效果啦&#xff01;&#xff09; 或者&#xff1a;使用HBuilder,创建HTML文件直接运行即可看…

HTML黑客帝国代码雨

1.用法 在电脑桌面新建一个文本文档&#xff0c;然后将代码复制到文本文档里&#xff0c;再将后缀改为".html"。 2.效果图 3.html代码 <!DOCTYPE html> <html> <head><title>黑客帝国代码雨</title> </head><body> <…

骇客代码雨

以下代码实现了代码雨的一些基本功能 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h>#define XMAX 150 #define YMAX 35 #define RAINLINES 50char *str "ki)udmnh*&(^%cobpwerxz$#<>?}{";st…

C++实现代码雨

各位博友们&#xff0c;大家好&#xff0c;今天给大家打一个代码雨 接下来是代码 #include <stdio.h> #include <time.h> #include <Windows.h> #include <graphics.h>#define WIDTH 960 #define HEIGHT 640 #define STR_SIZE 20 #define STR_NUM 128…

网页实现黑客帝国代码雨

网页实现黑客帝国代码雨 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"/><title>黑客帝国代码雨 </title><style type"text/css"> /*basic reset*/ *{margin:0;padding:0;} body{background:black;} ca…

Python实现代码雨效果

Python实现代码雨效果 main.py代码&#xff1a; """功能&#xff1a;代码雨效果作者&#xff1a;指尖魔法师QQ&#xff1a;14555110 """ import pygame import randomdef main():# 初始化pygamepygame.init()# 默认不全屏fullscreen False# …

酷炫黑客代码雨

大家看到这要说切scratch谁不会呀&#xff01; 我要说&#xff1a;退退退&#xff01; 话不多.................好了再见 代 码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>黑客帝国代码雨</title><st…

经典代码雨----C语言实现

代码架构&#xff1a; 1、初始化窗口&#xff08;窗口大小信息&#xff09; 2、描绘雨点信息&#xff08;颜色&#xff0c;数字&#xff09; 3、初始化雨&#xff08;雨点位置变化&#xff09; 4、下雨操作&#xff08;坐标更新&#xff09; 5、更新窗口&#xff08;场景描…

学习编程的方法及入门

&#xff08;入门&#xff09;学习编程可以通过以下步骤进行&#xff1a; 1. 确定学习目标&#xff1a;首先&#xff0c;明确你希望学习编程的具体目标和用途。这有助于你选择学习的编程语言和方向&#xff0c;例如网页开发、移动应用开发或数据分析等。 2. 选择编程语言&…

怎么学习编程?小白如何入门?

前言 编程的范围实在很大&#xff0c;学什么就是小白的首要问题。如果是学编程希望能够将重复工作自动化这类朋友&#xff0c;直接学Python即可。下文会说怎么学习&#xff0c;本文主要针对的是想要通过编程高薪转行的这类人。 一、编程方向 编程可就业的技术岗位非常多&…

易语言编程入门教程学习

易语言是一款中文开发软件&#xff0c;因为是国人开发的&#xff0c;对于国人使用也是比较友好的。其最大的特点&#xff0c;就是易&#xff0c;容易的易&#xff0c;新手入门很容易。 易语言简介 易语言是一门以中文作为程序代码编程语言。以“易”著称。创始人为吴涛。早期版…

入门编程指南:如何从零开始学习编程?

一、自学编程需要注意什么&#xff1f; 自学编程需要注意以下几点&#xff1a; 选择适合自己的编程语言&#xff0c;在学习初期建议选择易入手的编程语言。需要不断地练习&#xff0c;并建立自己的编程项目&#xff0c;以此提高编程技巧和应用能力。追求知识的全面性&#xf…

编程入门不知道怎么学?程序员小白来给你支招

最近有很多朋友私信小编,说想学编程,但是自己基础不好,很多东西都不会,看视频,遇到难点,也不知道怎么解决,甚至有时候竟为了找错误,花了一上午或一下午的时间,作为过来人的小编,确实很明白这些朋友的心情,因为小编也经历过(在此抱抱做安慰,不怕,有我在)。 从互联…

vs2017官方下载地址

Visual Studio 2017 15.9 Release Notes | Microsoft Docshttps://download.microsoft.com/download/D/1/4/D142F7E7-4D7E-4F3B-A399-5BACA91EB569/vs_Community.exe

目前下载VS2017你可能会遇到这个坑

可能现在大伙都已经开始使用VS2019进行开发了。VS2019的下载使用也都很简单。由于工作需要&#xff0c;今天要在笔记本上安装VS2017,结果发现&#xff0c;VS2017的下载变得不是那么容易了&#xff0c;官方的下载方式也隐藏的很深&#xff0c;来来回回折腾了好一会才下载下来&am…