1、创建Java工程,并导入如下jar包

opencv-440.jar

2、编写代码


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 {
        //路径不能包含中文  linux使用libopencv_java410.so
        String opencvDllName = "D:\\java_project\\opencv440-testFace\\lib\\opencv440\\build\\java\\x64\\opencv_java440.dll";
        System.load(opencvDllName);
        // xml路径不能包含中文
        String property = System.getProperty("user.dir") + "\\lib\\opencv440\\build\\etc\\haarcascades\\";
        faceDetector = new CascadeClassifier(property +  "haarcascade_frontalface_alt.xml");
    }
    // 灰度化人脸
    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 = "D:\\Documents\\Pictures\\2020-07-28_03+55+49_.png";
        String str2 = "D:\\Documents\\Pictures\\2020-07-28_03+55+53_.png";

        double compareHist = compare_image(str1, str2);
        System.out.println(compareHist);
        if (compareHist > 0.72) {
            System.out.println("人脸匹配");
        } else {
            System.out.println("人脸不匹配");
        }
    }
}

 

最后修改于 2020-08-03 19:09:41
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇