java opencv 相似度_opencv java小应用:比较两个图片的相似度

该博客介绍了一个Java应用程序,利用OpenCV库计算两张图片的相似度。首先,代码通过灰度化、人脸识别、人脸切割、直方图规一化步骤处理图片,然后使用直方图相似度匹配方法比较两张图片的相似度。如果相似度超过0.72,则认为人脸匹配。

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动态连接库

5588a4653c5c90fb4b4978cc784d9baa.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值