Java中利用OpenCV进行人脸识别
OpenCV
概述
OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,它提供了丰富的工具和算法,用于处理图像和视频数据。该库由一系列高效的计算机视觉算法组成,涵盖了许多领域,包括目标识别、图像处理、机器学习、三维重建等。
以下是OpenCV的一些关键特点和功能:
- 跨平台性: OpenCV是一个跨平台的计算机视觉库,支持Windows、Linux、macOS、iOS等多个操作系统。
- 图像处理: OpenCV提供了丰富的图像处理功能,包括图像滤波、边缘检测、形态学操作、颜色空间转换等。
- 特征检测与描述符: OpenCV包括多种特征检测和描述符算法,如SIFT、SURF、ORB等,用于在图像中寻找关键点并生成描述符。
- 目标检测: OpenCV支持多种目标检测算法,其中包括Haar级联分类器、HOG(Histogram of Oriented Gradients)等。
- 图像分割: OpenCV包括图像分割算法,用于将图像分成不同的区域或对象。
- 计算机视觉: OpenCV涉及计算机视觉的多个领域,如立体视觉、相机标定、运动估计等。
- 机器学习: OpenCV集成了一些机器学习算法,包括支持向量机、k近邻、决策树等。
- 深度学习: OpenCV对深度学习模型的支持不断增强,包括对常见深度学习框架(如TensorFlow、PyTorch)模型的集成。
- 多媒体处理: OpenCV支持对视频流和音频数据的处理,包括捕捉、录制、播放等。
- 开源和社区: 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();}
}
确保替换 imagePath
和 xmlFile
为你实际的图像文件路径和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进行人脸识别通常涉及以下步骤:
- 安装 OpenCV: 首先,确保你已经在你的Java项目中安装了OpenCV库。你可以通过Maven或手动下载并添加OpenCV的JAR文件到你的项目中。
- 加载 OpenCV 库: 在你的Java代码中,你需要加载OpenCV库。这可以通过以下方式之一完成:
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
或者,如果你使用的是OpenCV的Java wrapper,你可以使用:
nu.pattern.OpenCV.loadShared();
- 读取图像: 使用OpenCV的
Mat
类来加载图像。这是OpenCV中表示图像的数据结构。
Mat image = Imgcodecs.imread("path/to/your/image.jpg");
- 加载人脸分类器: 为了进行人脸检测,你需要使用Haar级联分类器。OpenCV提供了训练好的人脸检测器,你可以从OpenCV官方网站下载。
String xmlFile = "path/to/haarcascade_frontalface_default.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));
}
- 显示结果: 可以使用OpenCV的窗口显示图像。
HighGui.imshow("Detected Face", image);
HighGui.waitKey();
- 释放资源: 当你完成所有操作后,确保释放OpenCV对象。
image.release();
请注意,以上代码只是一个简单的示例。在实际应用中,你可能需要处理图像的各种情况,例如图像预处理、性能优化等。此外,你还可以使用深度学习模型进行人脸识别,OpenCV也提供了对深度学习模型的支持。
先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!
相关文章:

Java中利用OpenCV进行人脸识别
OpenCV 概述 OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,它提供了丰富的工具和算法,用于处理图像和视频数据。该库由一系列高效的计算机视觉算法组成,涵盖了许多领域,包括目…...

23111708[含文档+PPT+源码等]计算机毕业设计基于javaweb的旅游网站前台与后台旅景点
文章目录 **论文截图:****实现:****代码片段:** 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 下面是系统运行起来后的部分截图: 论文截图: 实现: 代码片段…...

Windows安装nvm【node.js版本管理工具】
目录 下载安装包 安装 配置 配置node的国内镜像源 配置npm的国内镜像源 常用命令 查看可安装的node版本 安装指定的版本 查看已有的node版本列表 切换版本 下载安装包 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11 安装 安装过程就不贴了࿰…...

让资产权利归于建设者:Kiosk使过程变得更简单
区块链凭借着其将人的权利地位置于平台之上的能力,可以重塑互联网,而自托管为个人提供了控制和管理其资产和数据的能力。链上交易支持建设者和客户之间的点对点交易。这些特质联合起来,可以将数字世界从基于价值提取的模式转变为基于价值创造…...
MLP感知机python实现
from torch import nn from softmax回归 import train_ch3 import torch import torchvision from torch.utils import data from torchvision import transforms# ①准备数据集 def load_data_fashion_mnist(batch_size, resizeNone):# PyTorch中的一个转换函数,它…...

Es 拼音搜索无法高亮
目录 背景: Es 版本: 第一步 第二步 (错误步骤 - 只是记录过程) 第三步 第四步 第五步 第六步 第七步 背景: app 原有的搜索功能无法进行拼音搜索,产品希望可以支持,例如内容中含有&a…...

java线性并发编程介绍-锁(二)
2.5 重量锁底层ObjectMonitor 需要去找到openjdk,在百度中直接搜索openjdk,第一个链接就是 找到ObjectMonitor的两个文件,hpp,cpp 先查看核心属性:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/69087d08d473…...
Java JPA详解:从入门到精通
描述:本文详细介绍了Java JPA的概念、使用方法以及常见问题,帮助读者从入门到精通掌握JPA。 关键词:Java JPA、Hibernate、持久层框架、ORM、数据库访问 一、Java JPA概述 Java Persistence API(JPA)是JavaEE 5规范…...

使用Open3D库处理3D模型数据的实践指南
目录 引言 一、安装Open3D库 二、加载3D模型数据 三、处理3D模型数据 1、去除模型中的无效面 2、提取模型特征 四、存储处理后的3D模型数据 五、可视化处理后的3D模型数据 六、注意事项 结论 引言 在处理3D模型数据时,Open3D库是一个功能强大且易于使用的…...

代码随想录算法训练营第五十八天丨 动态规划part18
739. 每日温度 思路 首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 什么时候用单调栈呢? 通常是一维数组,要寻找任一个元素的右边或者左边…...
Pytest自动化测试框架介绍
1、什么是单元测试框架 单元测试是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。 2、单元测试框架主要做什么 测试发现:从多个文件里面去找到我们需要的测试用例。 测试执行:按…...

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(五)
公共字段自动填充 1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试 1.1 问题分析 在前面我们已经完成了后台系统的员工管理功能和菜品分类功能的开发,在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修…...
Oracle 监控的指标有哪些和oracle巡检的内容
日常监控指标: 性能指标: 查询响应时间CPU利用率内存利用率磁盘 I/O 活动网络吞吐量 空间管理: 表空间使用率数据文件增长情况Undo 表空间使用率临时表空间使用率 会话和连接: 活跃会话数等待事件监控连接数和连接池效率 数据库对…...
Uniapp有奖猜歌游戏系统源码 带流量主
有奖猜歌游戏是一款基于uni-app、uniCloud、uniAD 开发的小游戏,通过猜歌曲、观看广告赚取现金奖励。 本游戏基本特征如下: 1、玩家可以通过猜歌、做任务等方式直接获取现金奖励 2、玩家可以通过猜歌、拆红包、做任务等方式获取金币奖励,当金币累积到一定数量可以兑换现金 3…...
【算法与数据结构】前言
算法与数据结构是OI中不可或缺的一部分。 今天,让我们走进算法与数据结构独特世界。 性能 算法与数据结构都是完成任务的方法。 方法就要有性能。 有效率就有描述性能的语言。 这就是复杂度。 复杂度的描述 由于复杂度描述的是大致性能,所以采用的是…...

(六)什么是Vite——热更新时vite、webpack做了什么
vite分享ppt,感兴趣的可以下载: Vite分享、原理介绍ppt 什么是vite系列目录: (一)什么是Vite——vite介绍与使用-CSDN博客 (二)什么是Vite——Vite 和 Webpack 区别࿰…...

贝加莱MQTT功能
贝加莱实现MQTT Client端的功能库和例程 导入库和例程,AS Logical View中分别通过Add Object—Library,Add—Program插入MQTT库和例程。 将例程Sample放置于CPU循环周期中 定义证书存放路径,在AS Physical View 中,右击PLC—Con…...

基于JavaWeb+SSM+购物系统微信小程序的设计和实现
基于JavaWebSSM购物系统微信小程序的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 第一章 绪 论 1.1选题背景 互联网是人类的基本需求,特别是在现代社会,…...

为什么需要Code Review?
1. Code Review 是什么? 代码审查(Code Review)是软件开发过程中对代码进行系统性检查和评审的一项活动。它是指团队成员之间相互检查彼此编写的代码,以确保代码质量、可读性和符合编码标准等。 2. Code Review 的必要性 ● 提…...

【计算机网络笔记】ICMP(互联网控制报文协议)
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...