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

您所在的位置:网站首页 技术脸图片 Java + opencv 实现人脸识别,图片人脸识别、视频人脸识别、摄像头实时人脸识别

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

2024-05-20 22:55| 来源: 网络整理| 查看: 265

大家好,又见面了,我是你们的朋友全栈君。

搭建环境

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 相关依赖包代码语言:javascript复制 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 commons-io commons-io 2.4 org.bytedeco javacv-platform 1.4.4 org.bytedeco.javacpp-presets opencv-platform 4.0.1-1.4.4 创建FaceVideo.class 主方法类 来进行人脸识别测试

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

代码语言:javascript复制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 的构造方法写 0 VideoCapture capture=new VideoCapture(0); Mat video=new Mat(); int index=0; if (capture.isOpened()) { while(i= 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 的构造方法写 0 VideoCapture 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张图片人脸的相似度在这里插入图片描述在这里插入图片描述完结。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144970.html原文链接:https://javaforall.cn



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3