如何使用OpenCV3直方图方法进行人脸相似度对比

2025-11-04 00:51:22

1、确定人脸图像保存的路径,在接下来过程中程序读取这些图片进行人脸相似度对比

图像库保存路劲:f:\mm\1

如何使用OpenCV3直方图方法进行人脸相似度对比

2、使用直方图方法计算人脸图像相似度,主要实现思路:

1)从本地读取两张人脸图像

2)将需要对比的图像进行HSV格式转换

3)构建图像的直方图模型,并进行直方图归一化

4)比较两张图片的直方图模型,计算图片的直方图相似度

5)判断相似度值,如果大于0.85左右我们可以认为两只人脸图片比较相似的

如何使用OpenCV3直方图方法进行人脸相似度对比

3、采用直方图方法进行人脸相似度的代码:

#include <opencv2/opencv.hpp>

#include <opencv2/core.hpp>

#include <opencv2/imgproc.hpp>

#include <opencv2/highgui.hpp>

#include <iostream>

#include <string>

#include <stdlib.h>

using namespace std;

using namespace cv;

//直方图比对

bool compareFacesByHist(M$at $img,$Mat $orgImg)

{

Mat $tmpImg;

resize(img, tmpImg, Size(orgImg.cols, orgImg.rows));

imshow("Img1", img);

imshow("tmpImg", tmpImg);

imshow("orgImg", orgImg);

//HSV颜色特征模型(色调H,饱和度S,亮度V)

cvtColor(tmpImg, tmpImg, COLOR_BGR2HSV);

cvtColor(orgImg, orgImg, COLOR_BGR2HSV);

//直方图尺寸设置

//一个灰度值可以设定一个bins,256个灰度值就可以设定256个bins

//对应HSV格式,构建二维直方图

//每个维度的直方图灰度值划分为256块进行统计,也可以使用其他值

int hBins = 256, sBins = 256;

int histSize[] = { hBins,sBins };

//H:0~180, S:0~255,V:0~255

//H色调取值范围

float hRanges[] = { 0,180 };

//S饱和度取值范围

float sRanges[] = { 0,255 };

const float* ranges[] = { hRanges,sRanges };

int channels[] = { 0,1 };//二维直方图

MatND hist1, hist2;

calcHist(&tmpImg, 1, channels, Mat(), hist1,2,histSize, ranges, true, false);

normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat());

calcHist(&orgImg, 1, channels, Mat(), hist2, 2, histSize, ranges, true, false);

normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat());

double similarityValue = compareHist(hist1, hist2, CV_COMP_CORREL);

cout << "相似度:" << similarityValue << endl;

if (similarityValue >= 0.85)

{

return true;

}

return false;

}

int main()

{

Mat orgImg = imread("F:\\mm\\1\\img0.jpg");

Mat img = imread("F:\\mm\\1\\img-1.jpg");

compareFacesByHist(img, orgImg);

waitKey(0);

return 0;

}

如何使用OpenCV3直方图方法进行人脸相似度对比

4、选择两张相似的人脸进行相似度比对测试

修改main函数中的载入图像文件:

Mat orgImg = imread("F:\\mm\\1\\img-4.jpg");

Mat img = imread("F:\\mm\\1\\img-1.jpg");

运行程序输出:相似度:0.805062

如何使用OpenCV3直方图方法进行人脸相似度对比

5、选择两张不同的人脸进行相似度比对测试

修改main函数中的载入图像文件:

Mat orgImg = imread("F:\\mm\\1\\img0.jpg");

Mat img = imread("F:\\mm\\1\\img-1.jpg");

运行程序输出:相似度:0.173482

如何使用OpenCV3直方图方法进行人脸相似度对比

6、选择两张相似的人脸,但色彩的和关照度不一样的进行相似度比对测试

修改main函数中的载入图像文件:

Mat orgImg = imread("F:\\mm\\1\\img-1.jpg");

Mat img = imread("F:\\mm\\1\\img-8.jpg");

运行程序输出:相似度:0.301016

从这个测试样例中可以发现,使用直方图的方法进行相似度对比的准确度并不高,应用场景有限。

如何使用OpenCV3直方图方法进行人脸相似度对比

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢