OpenCV 版本:4.4.0
下载地址:
链接:https://pan.quark.cn/s/9e8a53344e57
准备文件:
# 1. 特征分类器:windows 和 linux 中的配置文件都一样,随便用哪个都行
haarcascade_frontalface_alt.xml
# windows 路径 : opencv\build\etc\haarcascades
# linux 路径 : /usr/local/share/opencv4/haarcascades
# 2. jar 包 - 也可以直接使用 javacv 中的 opencv 包
opencv-440.jar
# windows 路径 : {opencv安装目录}\opencv\build\java
# linux 路径 : /usr/local/share/java/opencv4
# 3. 动态库
opencv_java440.dll (windows系统使用此文件)
# windows 路径 : {opencv安装目录}\opencv\build\java\{x64}/{x86} 跟据系统选择
libopencv_java440.so (linux系统使用此文件)
# linux 路径 : /usr/local/share/java/opencv4
添加依赖
# 方式1:引入本地jar包 ${project.basedir} : pom文件所在的目录
<dependency>
<groupId>org</groupId>
<artifactId>opencv</artifactId>
<scope>system</scope>
<systemPath>${project.basedir}\src\lib\opencv-440.jar</systemPath>
</dependency>
# 方式2:除了上面引入本地的,还可以直接使用 javacv 中的 opencv 包
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<version>4.4.0-1.5.4</version>
</dependency>
FaceCompare.java
package com.face.demo.util;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import java.util.Arrays;
public class FaceCompare {
// 初始化人脸探测器
static CascadeClassifier faceDetector;
static {
// 判断系统
String os = System.getProperty("os.name");
// 加载动态库
if (os != null && os.toLowerCase().startsWith("windows")) {
// Windows操作系统
// todo windows 系统部署加载 .dll 文件 - 路径跟据自己存放位置更改
System.load("C:\\Users\\Desktop\\lib\\windows\\opencv_java440.dll");
} else if (os != null && os.toLowerCase().startsWith("linux")) {
// Linux操作系统
// todo Linux 服务器部署加载 .so 文件 - 路径跟据自己存放位置更改
System.load("/opt/face/libopencv_java440.so");
}
// 引入 特征分类器配置 文件:haarcascade_frontalface_alt.xml 文件路径
String property = "/opt/face/haarcascade_frontalface_alt.xml";
System.out.println(property);
faceDetector = new CascadeClassifier(property);
}
// 灰度化人脸
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(10000000);
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 str1 = "C:\\Users\\Desktop\\head\\1.jpg";
String str2 = "C:\\Users\\Desktop\\head\\4.jpg";
double compareHist = compare_image(str1, str2);
System.out.println(compareHist);
if (compareHist > 0.6) {
System.out.println("人脸匹配");
} else {
System.out.println("人脸不匹配");
}
}
}
网友评论