Java中利用OpenCV进行人脸识别

OpenCV
概述

​ OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,它提供了丰富的工具和算法,用于处理图像和视频数据。该库由一系列高效的计算机视觉算法组成,涵盖了许多领域,包括目标识别、图像处理、机器学习、三维重建等。

以下是OpenCV的一些关键特点和功能:

  1. 跨平台性: OpenCV是一个跨平台的计算机视觉库,支持Windows、Linux、macOS、iOS等多个操作系统。
  2. 图像处理: OpenCV提供了丰富的图像处理功能,包括图像滤波、边缘检测、形态学操作、颜色空间转换等。
  3. 特征检测与描述符: OpenCV包括多种特征检测和描述符算法,如SIFT、SURF、ORB等,用于在图像中寻找关键点并生成描述符。
  4. 目标检测: OpenCV支持多种目标检测算法,其中包括Haar级联分类器、HOG(Histogram of Oriented Gradients)等。
  5. 图像分割: OpenCV包括图像分割算法,用于将图像分成不同的区域或对象。
  6. 计算机视觉: OpenCV涉及计算机视觉的多个领域,如立体视觉、相机标定、运动估计等。
  7. 机器学习: OpenCV集成了一些机器学习算法,包括支持向量机、k近邻、决策树等。
  8. 深度学习: OpenCV对深度学习模型的支持不断增强,包括对常见深度学习框架(如TensorFlow、PyTorch)模型的集成。
  9. 多媒体处理: OpenCV支持对视频流和音频数据的处理,包括捕捉、录制、播放等。
  10. 开源和社区: OpenCV是一个开源项目,拥有庞大的用户社区。这意味着你可以从社区获取支持,分享代码和经验。

使用OpenCV可以在计算机视觉和图像处理项目中加速开发过程。无论是学术研究还是商业应用,OpenCV都提供了丰富的工具和资源,帮助开发者处理图像和视频数据。

其他学习方式:

官网文档地址:https://docs.opencv.org/4.6.0/df/d65/tutorial_table_of_content_introduction.html

教程参考:https://www.w3cschool.cn/opencv/

教程参考:https://www.yiibai.com/opencv/opencv_adding_text.html

下载与安装

1、你可以从OpenCV的GitHub仓库下载Haar级联分类器的XML文件,该文件用于人脸检测。以下是官方的GitHub仓库地址:

https://github.com/opencv/opencv

在该仓库中,Haar级联分类器的XML文件通常位于 data/haarcascades 目录下。具体来说,用于人脸检测的文件是 haarcascade_frontalface_default.xml

你可以通过直接访问GitHub页面下载该文件,或者使用Git工具将整个仓库克隆到本地。以下是通过Git克隆仓库的命令:

git clone https://github.com/opencv/opencv.git

然后,你可以在 opencv/data/haarcascades 目录下找到 haarcascade_frontalface_default.xml 文件。

请注意,OpenCV的GitHub仓库可能会有更新,因此你可能需要查看最新的版本。
在这里插入图片描述

2、下载地址:https://opencv.org/releases/

在这里插入图片描述

下载到本地后,双击进行安装即可

在这里插入图片描述

目录说明

1、安装目录如下:

在这里插入图片描述

build :基于window构建

sources:开源,提供源码

2、这里是Java开发关注java目录即可:

在这里插入图片描述

x64与x86:代表给不同的系统使用

opencv-452.jar:给java操作openvc的程序包

3、由于是64位系统,所以关注x64目录:
在这里插入图片描述

DLL:(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。DLL文件,放置于系统中。当执行某一个程序时,相应的DLL文件就会被调用

实现操作集成依赖
方式一:

​ 这里使用IDEA进行开发,导入opencv-460.jar库,使用快捷键 Ctrl+Shift+Alt+S打开,选择库项,导入Java库:

在这里插入图片描述

方式二:

​ 创建一个maven项目(springboot也行),并引入依赖,在pom.xml文件中添加:

<!--添加 OpenCV 依赖-->
<dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.5.1-1</version> <!-- 替换为你所需的 OpenCV 版本 -->
</dependency>
Java代码示例
方式一:

​ 以下是一个简单的Java代码示例,演示如何使用OpenCV进行人脸识别。这个示例使用了OpenCV的Haar级联分类器来检测图像中的人脸。确保你已经将OpenCV的JAR文件添加到你的Java项目中。

import nu.pattern.OpenCV;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;/*** 描述:Java中利用OpenCV进行人脸识别** @author 为一道彩虹*/
public class FaceRecognition
{public static void main(String[] args){// 加载 OpenCV 库OpenCV.loadShared();// 读取图像String imagePath = "D://Test/1553247564696949.jpg";Mat image = Imgcodecs.imread(imagePath);// 加载人脸分类器String xmlFile = "D://haarcascade_frontalface_alt.xml";CascadeClassifier faceDetector = new CascadeClassifier(xmlFile);// 人脸检测MatOfRect faceDetections = new MatOfRect();faceDetector.detectMultiScale(image, faceDetections);// 绘制人脸框for (Rect rect : faceDetections.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));}// 显示结果HighGui.imshow("Detected Face", image);HighGui.waitKey();// 释放资源image.release();}
}

确保替换 imagePathxmlFile 为你实际的图像文件路径和Haar级联分类器的XML文件路径。

原图:

在这里插入图片描述

利用 OpenCV进行人脸检测的结果:

在这里插入图片描述

方式二:

​ 除了上述方式,还可以将opencv-452.jar安装到本地仓库或私有仓库,然后在pom.xml中引入依赖。

在这里插入图片描述

pom.xml文件中,通过坐标的形式引入

<!-- 加载lib目录下的opencv包 -->
<dependency><groupId>org.opencv</groupId><artifactId>opencv</artifactId><version>4.5.2</version><scope>system</scope><systemPath>${basedir}/lib/opencv-460.jar</systemPath>
</dependency>
验证
public class MyTest 
{// 调用OpenCV库文件static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}public static void main(String args[]){// 创建一个3X3的对角矩阵Mat a = Mat.eye(3, 3, CvType.CV_8UC1);System.out.println(a.dump());}
}

执行上述代码,不出意外将出现如下异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java460 in java.library.pathat java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)at java.lang.Runtime.loadLibrary0(Runtime.java:871)at java.lang.System.loadLibrary(System.java:1122)

解决方案有2种:

1.将D:\Java\opencv\build\java\x64\opencv_java452.dll文件拷贝至下面2个目录,任选其一即可。

在这里插入图片描述

在这里插入图片描述

2.通过指定虚拟机参数解决:

try
{String openCVDllName = "D:\\Java\\opencv\\build\\java\\x64\\opencv_java452.dll";// 本文使用 openCV4.5.2System.load(openCVDllName);
}
catch (SecurityException e)
{System.out.println(e.toString());System.exit(-1);
}
catch (UnsatisfiedLinkError e)
{System.out.println(e.toString());System.exit(-1);
}

​ 以下是一个简单的Java代码示例,演示如何使用OpenCV进行人脸识别。这个示例使用了OpenCV的Haar级联分类器来检测图像中的人脸。确保你已经将OpenCV的JAR文件添加到你的Java项目中。

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;/*** 描述:描述:Java中利用OpenCV进行人脸识别** @author 为一道彩虹*/
public class DetectFaceDemo
{public static void detectFace(String imagePath, String outFile) throws Exception{System.out.println("开始人脸检测...");// 加载人脸分类器String xmlFile = "D://haarcascade_frontalface_alt.xml";CascadeClassifier faceDetector = new CascadeClassifier(xmlFile);Mat image = Imgcodecs.imread(imagePath);// 在图片中检测人脸MatOfRect faceDetections = new MatOfRect();faceDetector.detectMultiScale(image, faceDetections);System.out.println(String.format("检测到 %s个人脸", faceDetections.toArray().length));// 绘制人脸框Rect[] rects = faceDetections.toArray();if (rects != null && rects.length > 1){for (Rect rect : rects){// 在每一个识别出来的人脸周围画出一个方框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);}}// 存储Imgcodecs.imwrite(outFile, image);System.out.println(String.format("人脸检测结果,人脸检测图片文件为:%s", outFile));}public static void main(String[] args) throws Exception{try{String openCVDllName = "D:\\Java\\opencv\\build\\java\\x64\\opencv_java452.dll";// 本文使用 openCV4.5.2System.load(openCVDllName);}catch (SecurityException e){System.out.println(e.toString());System.exit(-1);}catch (UnsatisfiedLinkError e){System.out.println(e.toString());System.exit(-1);}// 人脸测试String imagePath = "D:\\Test\\1553247564696949.jpg";detectFace(imagePath, "D:\\face2.png");}
}

利用 OpenCV进行人脸检测的结果:

在这里插入图片描述

在这里插入图片描述

总结:

在Java中使用OpenCV进行人脸识别通常涉及以下步骤:

  1. 安装 OpenCV: 首先,确保你已经在你的Java项目中安装了OpenCV库。你可以通过Maven或手动下载并添加OpenCV的JAR文件到你的项目中。
  2. 加载 OpenCV 库: 在你的Java代码中,你需要加载OpenCV库。这可以通过以下方式之一完成:
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

或者,如果你使用的是OpenCV的Java wrapper,你可以使用:

nu.pattern.OpenCV.loadShared();
  1. 读取图像: 使用OpenCV的 Mat 类来加载图像。这是OpenCV中表示图像的数据结构。
Mat image = Imgcodecs.imread("path/to/your/image.jpg");
  1. 加载人脸分类器: 为了进行人脸检测,你需要使用Haar级联分类器。OpenCV提供了训练好的人脸检测器,你可以从OpenCV官方网站下载。
String xmlFile = "path/to/haarcascade_frontalface_default.xml";
CascadeClassifier faceDetector = new CascadeClassifier(xmlFile);
  1. 人脸检测: 使用加载的分类器对图像进行人脸检测。
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
  1. 绘制人脸框: 遍历检测到的人脸并在图像上绘制矩形框。
for (Rect rect : faceDetections.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));
}
  1. 显示结果: 可以使用OpenCV的窗口显示图像。
HighGui.imshow("Detected Face", image);
HighGui.waitKey();
  1. 释放资源: 当你完成所有操作后,确保释放OpenCV对象。
image.release();

请注意,以上代码只是一个简单的示例。在实际应用中,你可能需要处理图像的各种情况,例如图像预处理、性能优化等。此外,你还可以使用深度学习模型进行人脸识别,OpenCV也提供了对深度学习模型的支持。

先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/147113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改服务器端Apache默认根目录

目标&#xff1a;修改默认Apache网站根目录 /var/www/html 一、找到 DocumentRoot “/var/www/html” 这一段 apache的根目录&#xff0c;把/var/www/html 这个目录改 #DocumentRoot "/var/www/html" DocumentRoot "/home/cloud/tuya_mini_h5/build" 二、…

小程序如何添加打印机来打印订单

在采云小程序中&#xff0c;支持打印订单的小票、标签、发货单和电子面单。小票打印机用于打印小票&#xff0c;类似于超市小票、外卖小票等。标签打印机用于打印商品标签&#xff0c;类似于奶茶上面粘贴的标签&#xff0c;用于表示饮料名称和规格等。货单打印机用于打印发货单…

【好奇心驱动力】ESP8266驱动SG90舵机开关灯

0.前言 ESP8266弄丢了好几个都忘记放在哪&#xff0c;重新买了个typeC接口的方便多了&#xff0c;看到驱动SG90舵机作为智能开关&#xff0c;简单复现了一下&#xff0c;代码比较简单&#xff0c;没有连接小爱同学或者其他语音助手。 1.实验方法 ESP8266连接SG90舵机&#x…

32位单片机PY32F040,主频72M,外设丰富,支持断码LCD

PY32F040 系列微控制器采用高性能的 32 位 ARM Cortex-M0 内核,宽电压工作范围的 MCU。嵌入高达 128 Kbytes flash 和 16 Kbytes SRAM 存储器,最高工作频率 72 MHz。LQFP64封装两块出头就可以拿到&#xff0c;我们还有开发板和开发资料帮助客户更好的开发。 PY32F040 系列微控…

C# NAudio 音频库

C# NAudio 音频库 NAudio安装NAudio简述简单示例1录制麦克风录制系统声卡WAV格式播放MP3格式播放AudioFileReader读取播放音频MediaFoundationReader 读取播放音频 NAudio安装 项目>NuGet包管理器 搜索NAudio点击安装&#xff0c;自动安装依赖库。 安装成功后工具箱会新增…

视频推拉流EasyDSS直播点播平台获取指定时间快照的实现方法

视频推拉流直播点播系统EasyDSS平台&#xff0c;可提供流畅的视频直播、点播、视频推拉流、转码、管理、分发、录像、检索、时移回看等功能&#xff0c;可兼容多操作系统&#xff0c;在直播点播领域具有广泛的场景应用。为了便于用户集成、调用与二次开发。 今天我们来介绍下在…

KT148A语音芯片使用串口uart本控制的完整说明_包含硬件和指令举例

一、功能简介 KT148A肯定是支持串口的&#xff0c;有客户反馈使用一线还是不方便&#xff0c;比如一些大型的系统不适合有延时的操作&#xff0c;所以更加倾向于使用uart控制&#xff0c;这里我们也给出解决方案 延伸出来另外一个版本&#xff0c;KT158A 注意次版本芯片还是…

ArcGIS Maps SDK for JS:监听图层的visible属性

文章目录 1 问题描述2 解决方案3 拓展 1 问题描述 近期有这么一个需求。在 ArcGIS Maps SDK for JavaScript 中&#xff0c;使用图层的visible属性同步显示某个组件&#xff0c;即打开图层时显示组件&#xff0c;关闭图层时隐藏组件。 首先想到的是&#xff0c;通过点击图层列…

HTTP 到 HTTPS 再到 HSTS 的转变

近些年&#xff0c;随着域名劫持、信息泄漏等网络安全事件的频繁发生&#xff0c;网站安全也变得越来越重要&#xff0c;也促成了网络传输协议从 HTTP 到 HTTPS 再到 HSTS 的转变。 HTTP HTTP&#xff08;超文本传输协议&#xff09; 是一种用于分布式、协作式和超媒体信息系…

OpenAI的多函数调用(Multiple Function Calling)简介

我在六月份写了一篇关于GPT 函数调用&#xff08;Function calling) 的博客https://blog.csdn.net/xindoo/article/details/131262670&#xff0c;其中介绍了函数调用的方法&#xff0c;但之前的函数调用&#xff0c;在一轮对话中只能调用一个函数。就在上周&#xff0c;OpenAI…

Ubuntu22.04 部署Mqtt服务器

1、打开Download EMQX &#xff08;www.emqx.io&#xff09;下载mqtt服务器版本 2、Download the EMQX repository curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash 3.Install EMQX sudo apt-get install emqx 4.Run EMQX sudo systemctl start…

开源与闭源:数字化时代的辩论与未来走向

在当今的数字化时代&#xff0c;关于开源和闭源软件的辩论一直是技术界的热门话题。 特斯拉CEO马斯克最近也加入了这场辩论&#xff0c;公开表示OpenAI不应该闭源&#xff0c;而他自己的首款聊天机器人将选择开源。 这引发了人们对开源与闭源软件的进一步思考&#xff1a;开源是…

《全程软件测试 第三版》拆书笔记

第一章 对软件测试的全面认识&#xff0c;测试不能是穷尽的 软件测试的作用&#xff1a; 1.产品质量评估&#xff1b;2.持续质量反馈&#xff1b;3.客户满意度提升&#xff1b;4.缺陷的预防 正反思维&#xff1a;正向思维&#xff08;广度&#xff0c;良好覆盖面&#xff09;逆…

sql注入 [极客大挑战 2019]LoveSQL 1

打开题目 几次尝试&#xff0c;发现输1 1"&#xff0c;页面都会回显NO,Wrong username password&#xff01;&#xff01;&#xff01; 只有输入1&#xff0c;页面报错&#xff0c;说明是单引号的字符型注入 那我们万能密码试试能不能登录 1 or 11 # 成功登录 得到账号…

系列六、JVM的内存结构【栈】

一、产生背景 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的&#xff0c;不同平台的CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 二、概述 栈也叫栈内存&#xff0c;主管Java程序的运行&#xff0c;是在线程创建时创建&#xff0c;线程销毁时销毁&…

从0开始学习JavaScript--JavaScript 循环与迭代详解

JavaScript中的循环和迭代是编写高效和灵活代码的关键。循环用于重复执行一段代码&#xff0c;而迭代则用于遍历数据结构。本文将深入研究JavaScript中常见的循环结构和迭代方法&#xff0c;并通过丰富的示例代码来帮助读者更好地理解和运用这些概念。 基本的for循环 for循环…

el-table固定表头(设置height)出现内容过多时不能滚动问题

主要原因是el-table没有div包裹 解决&#xff1a;加一个div并设置其高度和overflow 我自己的主要代码 <div class"contentTable"><el-tableref"table":data"tableData"striperow-dblclick"onRowDblclick"height"100%&q…

B031-网络编程 Socket Http TomCat

目录 计算机网络网络编程相关术语IP地址ip的概念InerAdress的了解与测试 端口URLTCP、UDP和7层架构TCPUDPTCP与UDP的区别和联系TCP的3次握手七层架构 Socket编程服务端代码客户端代码 http协议概念Http报文 Tomcat模拟 计算机网络 见文档 网络编程相关术语 见文档 IP地址 …

3.3 Windows驱动开发:内核MDL读写进程内存

MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式。在Windows操作系统中&#xff0c;每个进程都有自己独立的虚拟地址空间&#xff0c;不同进程之间的内存空间是隔离的。因此&#xff0c;要在一个进程中读取或写入另一个进程的内存数据&#xff0c;需要先将目标进…

unity教程

前言 伴随游戏行业的兴起&#xff0c;unity引擎的使用越来越普遍&#xff0c;本文章主要记录博主本人入门unity的相关记录大部分依赖siki学院进行整理。12 一、认识unity引擎&#xff1f; 1、Unity相关信息&#xff1a; Unity的诞生&#xff1a;https://www.jianshu.com/p/550…