美文网首页
[Java] 人脸识别 - 相似度

[Java] 人脸识别 - 相似度

作者: 卓灬不凡 | 来源:发表于2023-05-28 14:18 被阅读0次

    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("人脸不匹配");
            }
        }
    
    }
    

    相关文章

      网友评论

          本文标题:[Java] 人脸识别 - 相似度

          本文链接:https://www.haomeiwen.com/subject/yohdedtx.html