opencv java小應用:比較兩個圖片的類似度

package com.company;

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 FaceCompareMain {

    //初始化人臉探測器
    static CascadeClassifier faceDetector;

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        faceDetector = new CascadeClassifier(
            "D:\\ib\\face-detact\\src\\com\\company\\haarcascade_frontalface_alt.xml");
    }

    // 1.  灰度化(減少圖片大小)
    // 2. 人臉識別
    // 3. 人臉切割
    // 4. 規一化(人臉直方圖)
    // 5. 直方圖類似度匹配

    public static void main(String[] args) {
        String basePicPath = "D:\\ib\\face-detact\\src\\pics\\";
        double compareHist = compare_image(basePicPath + "11_1.png", basePicPath + "11_2.png");
        System.out.println(compareHist);
        if (compareHist > 0.72) {
            System.out.println("人臉匹配");
        } else {
            System.out.println("人臉不匹配");
        }
    }

    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;
    }

    // "D:\\ib\\face-detact\\src\\com\\company\\a1.jpg"
    private static Mat conv_Mat(String img_1) {
        Mat image0 = Imgcodecs.imread(img_1);

        Mat image = new Mat();
        //灰度轉換
        Imgproc.cvtColor(image0, image, Imgproc.COLOR_BGR2GRAY);

        MatOfRect faceDetections = new MatOfRect();
        //探測人臉
        faceDetector.detectMultiScale(image, faceDetections);

        // rect中是人臉圖片的範圍
        for (Rect rect : faceDetections.toArray()) {
            //切割rect人臉
            Mat mat = new Mat(image, rect);
            return mat;
        }
        return null;
    }

}

代碼 本文使用opencv 3.4.5版本,opencv大版本api變更很多java

java項目設置,須要引入opencv native動態鏈接庫 git

參考 : https://github.com/opencv/opencv/releasesgithub

相關文章
相關標籤/搜索