多语言展示
当前在线:1125今日阅读:2今日分享:38

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

在上一次我们介绍了如何使用OpenCV通过摄像头进行人脸识别,并将识别的人脸作为图像保存到本地,这里我们接着人脸识别的课题继续学习人脸相似度的对比,通过对比将保存的人脸识别出的图像分类保存。9如何使用visualStudio+OpenCV 3.0进行人脸识别
工具/原料
1

Visual Studio 2017

2

OpenCV 3.4

方法/步骤
1

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

2

使用直方图方法计算人脸图像相似度,主要实现思路:1)从本地读取两张人脸图像2)将需要对比的图像进行HSV格式转换3)构建图像的直方图模型,并进行直方图归一化4)比较两张图片的直方图模型,计算图片的直方图相似度5)判断相似度值,如果大于0.85左右我们可以认为两只人脸图片比较相似的

3

采用直方图方法进行人脸相似度的代码:#include #include #include #include #include #include #include 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;}

4

选择两张相似的人脸进行相似度比对测试修改main函数中的载入图像文件:Mat orgImg = imread('F:\\mm\\1\\img-4.jpg');Mat img = imread('F:\\mm\\1\\img-1.jpg');运行程序输出:相似度:0.805062

5

选择两张不同的人脸进行相似度比对测试修改main函数中的载入图像文件:Mat orgImg = imread('F:\\mm\\1\\img0.jpg');Mat img = imread('F:\\mm\\1\\img-1.jpg');运行程序输出:相似度:0.173482

6

选择两张相似的人脸,但色彩的和关照度不一样的进行相似度比对测试修改main函数中的载入图像文件:Mat orgImg = imread('F:\\mm\\1\\img-1.jpg');Mat img = imread('F:\\mm\\1\\img-8.jpg');运行程序输出:相似度:0.301016从这个测试样例中可以发现,使用直方图的方法进行相似度对比的准确度并不高,应用场景有限。

推荐信息