搭建环境

opencv官网下载windows安装包 https://opencv.org/releases/
选择最新版4.1.1 下载完成后是一个opencv-4.1.1-vc14_vc15.exe,双击安装。

重要: 把安装路径D:\Sofeware\opencv\build\bin下面的两个文件复制到 D:\Sofeware\opencv\build\java\x64 (为了支持读取视频流)

集成到IDEA中

打开project structure --> modules -->dependencies 引入D:\Sofeware\opencv\build\java 下的opencv-411.jar包,然后编辑这个包加入D:\Sofeware\opencv\build\x64 路径里的资源


pom.xml 相关依赖包

<!-- 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><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.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>

创建FaceVideo.class 主方法类 来进行人脸识别测试

注意修改下面 faceDetector = new CascadeClassifier( 中.xml路径改成你的路径。

package com.jack.demo.face;import org.opencv.core.*;
import org.opencv.highgui.HighGui;
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 java.util.Arrays;/**** @Title: Opencv 图片人脸识别、实时摄像头人脸识别、视频文件人脸识别* @Description: OpenCV-4.1.1 测试文件* @date: 2019年8月19日 17:17:48* @version: V-1.0.0**/
public class FaceVideo {// 初始化人脸探测器static CascadeClassifier faceDetector;static int i=0;static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);faceDetector = new CascadeClassifier("D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");}public static void main(String[] args) {// 1- 从摄像头实时人脸识别,识别成功保存图片到本地getVideoFromCamera();// 2- 从本地视频文件中识别人脸
//        getVideoFromFile();// 3- 本地图片人脸识别,识别成功并保存人脸图片到本地face();// 4- 比对本地2张图的人脸相似度 (越接近1越相似)String basePicPath = "D:\\Documents\\Pictures\\";double compareHist = compare_image(basePicPath + "fc.jpg", basePicPath + "fc_1.jpg");System.out.println(compareHist);if (compareHist > 0.72) {System.out.println("人脸匹配");} else {System.out.println("人脸不匹配");}}/*** OpenCV-4.1.1 从摄像头实时读取* @return: void* @date: 2019年8月19日 17:20:13*/public static void getVideoFromCamera() {//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));index=HighGui.waitKey(100);if (index==27) {capture.release();break;}}}else{System.out.println("摄像头未开启");}try {capture.release();Thread.sleep(1000);System.exit(0);} catch (InterruptedException e) {e.printStackTrace();}return;}/*** OpenCV-4.1.1 从视频文件中读取* @return: void* @date: 2019年8月19日 17:20:20*/public static void getVideoFromFile() {VideoCapture capture=new VideoCapture();capture.open("C:\\Users\\Administrator\\Desktop\\1.avi");//1 读取视频文件的路径if(!capture.isOpened()){System.out.println("读取视频文件失败!");return;}Mat video=new Mat();int index=0;while(capture.isOpened()) {capture.read(video);//2 视频文件的视频写入 Mat video 中HighGui.imshow("本地视频识别人脸", getFace(video));//3 显示图像index=HighGui.waitKey(100);//4 获取键盘输入if(index==27) {//5 如果是 Esc 则退出capture.release();return;}}}/*** OpenCV-4.1.1 人脸识别* @date: 2019年8月19日 17:19:36* @param image 待处理Mat图片(视频中的某一帧)* @return 处理后的图片*/public static Mat getFace(Mat image) {// 1 读取OpenCV自带的人脸识别特征XML文件(faceDetector)
//        CascadeClassifier facebook=new CascadeClassifier("D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");// 2  特征匹配类MatOfRect face = new MatOfRect();// 3 特征匹配faceDetector.detectMultiScale(image, face);Rect[] rects=face.toArray();System.out.println("匹配到 "+rects.length+" 个人脸");if(rects != null && rects.length >= 1) {// 4 为每张识别到的人脸画一个圈for (int i = 0; i < rects.length; i++) {Imgproc.rectangle(image, new Point(rects[i].x, rects[i].y), new Point(rects[i].x + rects[i].width, rects[i].y + rects[i].height), new Scalar(0, 255, 0));Imgproc.putText(image, "Human", new Point(rects[i].x, rects[i].y), Imgproc.FONT_HERSHEY_SCRIPT_SIMPLEX, 1.0, new Scalar(0, 255, 0), 1, Imgproc.LINE_AA, false);//Mat dst=image.clone();//Imgproc.resize(image, image, new Size(300,300));}i++;if(i==3) {// 获取匹配成功第10次的照片Imgcodecs.imwrite("D:\\Documents\\Pictures\\" + "face.png", image);}}return image;}/*** OpenCV-4.1.1 图片人脸识别* @return: void* @date: 2019年5月7日12:16:55*/public static void face() {// 1 读取OpenCV自带的人脸识别特征XML文件//OpenCV 图像识别库一般位于 opencv\sources\data 下面
//        CascadeClassifier facebook=new CascadeClassifier("D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");// 2 读取测试图片String imgPath = "D:\\Documents\\Pictures\\he.png";Mat image=Imgcodecs.imread(imgPath);if(image.empty()){System.out.println("image 内容不存在!");return;}// 3 特征匹配MatOfRect face = new MatOfRect();faceDetector.detectMultiScale(image, face);// 4 匹配 Rect 矩阵 数组Rect[] rects=face.toArray();System.out.println("匹配到 "+rects.length+" 个人脸");// 5 为每张识别到的人脸画一个圈int i =1 ;for (Rect rect : face.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), 3);imageCut(imgPath, "D:\\Documents\\Pictures\\"+i+".jpg", rect.x, rect.y, rect.width, rect.height);// 进行图片裁剪i++;}// 6 展示图片HighGui.imshow("人脸识别", image);HighGui.waitKey(0);}/*** 裁剪人脸* @param imagePath* @param outFile* @param posX* @param posY* @param width* @param height*/public static void imageCut(String imagePath, String outFile, int posX, int posY, int width, int height) {// 原始图像Mat image = Imgcodecs.imread(imagePath);// 截取的区域:参数,坐标X,坐标Y,截图宽度,截图长度Rect rect = new Rect(posX, posY, width, height);// 两句效果一样Mat sub = image.submat(rect); // Mat sub = new Mat(image,rect);Mat mat = new Mat();Size size = new Size(width, height);Imgproc.resize(sub, mat, size);// 将人脸进行截图并保存Imgcodecs.imwrite(outFile, mat);System.out.println(String.format("图片裁切成功,裁切后图片文件为: %s", outFile));}/*** 人脸比对* @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(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;}/*** 灰度化人脸* @param img* @return*/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;}/*** OpenCV-4.1.1 将摄像头拍摄的视频写入本地* @return: void* @date: 2019年8月19日 17:20:48*/public static void writeVideo() {//1 如果要从摄像头获取视频 则要在 VideoCapture 的构造方法写 0VideoCapture capture=new VideoCapture(0);Mat video=new Mat();int index=0;Size size=new Size(capture.get(Videoio.CAP_PROP_FRAME_WIDTH),capture.get(Videoio.CAP_PROP_FRAME_HEIGHT));VideoWriter writer=new VideoWriter("D:/a.mp4",VideoWriter.fourcc('D', 'I', 'V', 'X'), 15.0,size, true);while(capture.isOpened()) {capture.read(video);//2 将摄像头的视频写入 Mat video 中writer.write(video);HighGui.imshow("像头获取视频", video);//3 显示图像index=HighGui.waitKey(100);//4 获取键盘输入if(index==27) {//5 如果是 Esc 则退出capture.release();writer.release();return;}}}}

开始测试>>>

右键执行FaceVideo.Class Main()方法

如果出现运行Main方法时报错:java.lang.UnsatisfiedLinkError: no opencv_java411 in java.library.path(需要加一个运行参数)

编辑启动类:Edit Configuration VM options:-Djava.library.path=D:\Sofeware\opencv\build\java\x64;

1- 测试摄像头实时识别人脸:

2- 测试本地视频识别人脸

3- 测试本地图片人脸识别

4- 测试本地2张图片人脸的相似度

完结。

Java + opencv 实现人脸识别,图片人脸识别、视频人脸识别、摄像头实时人脸识别相关推荐

  1. 【javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码)】

    javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码) 文章目录 javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄 ...

  2. 使用mediapipe和OpenCV实现摄像头实时人脸检测

    # 摄像头实时人脸检测 # opencv import timeimport cv2 # mediapipe ai工具包 import mediapipe as mp # 进度条库 from tqdm ...

  3. python摄像头跟随人脸_Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  4. python恶搞代码打开对方摄像头_Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示...

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  5. python实现面部特效_Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  6. 基于python keras口罩检测人脸检测佩戴口罩可读视频可读摄像头实时视频流

    人脸识别技术已经非常普及啦,现在戴口罩的脸支付宝也可以识别,据报道阿里现在正在尝试主导人脸识别技术的某些标准.在商业上大多数公司会选择国内AI大咖,比如百度智能云.阿里智慧云.华为云.腾讯云等等.这些 ...

  7. Yolov5进阶之一摄像头实时采集识别

    当yolov5 安装成功后,(如果想快速安装可以看之前帖子),第一步是熟悉相应的采集过程,最简单的是图片,然后是视频,然后是实时采集,具体过程只需更改yolov5 master 里的 detect文件 ...

  8. gpu训练cnn人脸识别准确率_opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别

    opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别 Abstract:本文记录了在学习深度学习过程中,使用opencv+mtcnn+facenet+pyth ...

  9. 基于face_recognition库的摄像头实时人脸识别测试

    前言 介绍一个基于python的开源人脸识别库,且其离线识别率高达99.38%, github上的网址:github链接 该库可以通过python或者命令行即可实现人脸识别的功能.使用dlib深度学习 ...

最新文章

  1. 在服务器无root权限手动安装texlive
  2. Android QQ、微信聊天消息界面设计原理与实现
  3. 破旧立新,精准测试之道
  4. java响应鼠标滚轮事件_一文读懂鼠标滚轮事件(wheelEvent)
  5. jQuery(三) javascript跨域问题(JSONP解决)
  6. mongodb在aggregate lookup 进行分页查询,获得记录总数
  7. 所有controller interceptor_阿里二面:filter、interceptor、aspect应如何选择?很多人中招...
  8. java/android 做题中整理的碎片小贴士(15)
  9. 大势至服务器共享文件监控软件8.6,大势至服务器共享文件夹监控软件、局域网共享管理软件、局域网共享设置软件...
  10. 小米手机怎么打不开云服务器错误,为什么小米云服务打不开页面?
  11. 计算机科学检索课题,文献检索报告课题.docx
  12. laravel connector.php,如何获得laravel DB连接到PHP连接?
  13. 卡刷android版本不一致,你好,请问一下,关于跨安卓版本刷机的问题
  14. 计算机科学与技术专业为什么要学物理,「物理」一定要好的14个大学专业
  15. 读写文件时缓冲区多大好呢?我来告诉大家哈
  16. python api接口10060_Python请求错误10060
  17. hotspot源码角度看OOP之类属性的底层实现(一)
  18. Android可拖动可吸附悬浮窗
  19. VtigerCRM重置管理员密码
  20. 计算机专业当兵退役什么工作,当兵退伍后能做什么 能干什么工作

热门文章

  1. HTTP协议工作原理及详细介绍
  2. STM32单片机智能跟随小车_红外遥控(程序+原理图+PCB+论文报告)
  3. 如何获取windows剪切板中内容
  4. [STM32]利用串口实现F1 F4双机通信问题
  5. 用Flutter实现小Q聊天机器人(五)
  6. Linux下wordpress安装教程(全)
  7. 考研英语各题型的正确率情况
  8. 游戏服务器框架php,golang -Pitaya 游戏服务器框架中文API教程
  9. 两个解决R特殊符号报错的小技巧
  10. 驱动卸载时对系统线程的处理