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動態連接庫