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項目設置,需要引入opencv native動態連接庫

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM