OpenCV学习笔记3:找出人脸,同时比较两张图片中的人脸相似度
转自
终于到了有实际应用的功能了,有2张图片,里面各有一个人脸,我的目的是比较这两个人脸的相似度,这里用到了facedetect的功能,还有图像转换,图像剪切,以及直方图的比较。具体流程是:
1。分别用facedetect功能将两张图片中的人脸检测出来
2。将人脸部分的图片剪切出来,存到两张只有人脸的图片里。
3。将这两张人脸图片转换成单通道的图像
4。使用直方图比较这两张单通道的人脸图像,得出相似度。
这里对图的要求还是比较高的,光线和姿势不能有差别,脸的垂直或者左右角度偏差就会影响比较,但和两张图片的大小关系不大,本人觉得较适合于证件照的对比。
下面是代码,其中haarcascade_frontalface_alt.xml是OpenCV里facedetect例子用的样本。 比较的是srcImage和targetImage对应的文件.
还有下面是IplImage和Mat混用,纯当熟悉这两个类了。
- #include "opencv/cv.hpp"
- #include "opencv2/objdetect/objdetect.hpp"
- #include "opencv2/highgui/highgui.hpp"
- #include "opencv2/imgproc/imgproc.hpp"
- #include <iostream>
- #include <stdio.h>
- using namespace std;
- using namespace cv;
- String cascadeName = "D:\\OpenCV-2.4.2\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
- IplImage* cutImage(IplImage* src, CvRect rect) {
- cvSetImageROI(src, rect);
- IplImage* dst = cvCreateImage(cvSize(rect.width, rect.height),
- src->depth,
- src->nChannels);
- cvCopy(src,dst,0);
- cvResetImageROI(src);
- return dst;
- }
- IplImage* detect( Mat& img, CascadeClassifier& cascade, double scale)
- {
- int i = 0;
- double t = 0;
- vector<Rect> faces;
- Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );
- cvtColor( img, gray, CV_BGR2GRAY );
- resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
- equalizeHist( smallImg, smallImg );
- t = (double)cvGetTickCount();
- cascade.detectMultiScale( smallImg, faces,
- 1.3, 2, CV_HAAR_SCALE_IMAGE,
- Size(30, 30) );
- t = (double)cvGetTickCount() - t;
- printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
- for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
- {
- IplImage* temp = cutImage(&(IplImage(img)), cvRect(r->x, r->y, r->width, r->height));
- return temp;
- }
- return NULL;
- }
- //画直方图用
- int HistogramBins = 256;
- float HistogramRange1[2]={0,255};
- float *HistogramRange[1]={&HistogramRange1[0]};
- int CompareHist(IplImage* image1, IplImage* image2)
- {
- IplImage* srcImage;
- IplImage* targetImage;
- if (image1->nChannels != 1) {
- srcImage = cvCreateImage(cvSize(image1->width, image1->height), image1->depth, 1);
- cvCvtColor(image1, srcImage, CV_BGR2GRAY);
- } else {
- srcImage = image1;
- }
- if (image2->nChannels != 1) {
- targetImage = cvCreateImage(cvSize(image2->width, image2->height), srcImage->depth, 1);
- cvCvtColor(image2, targetImage, CV_BGR2GRAY);
- } else {
- targetImage = image2;
- }
- CvHistogram *Histogram1 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);
- CvHistogram *Histogram2 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);
- cvCalcHist(&srcImage, Histogram1);
- cvCalcHist(&targetImage, Histogram2);
- cvNormalizeHist(Histogram1, 1);
- cvNormalizeHist(Histogram2, 1);
- // CV_COMP_CHISQR,CV_COMP_BHATTACHARYYA这两种都可以用来做直方图的比较,值越小,说明图形越相似
- printf("CV_COMP_CHISQR : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CHISQR));
- printf("CV_COMP_BHATTACHARYYA : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_BHATTACHARYYA));
- // CV_COMP_CORREL, CV_COMP_INTERSECT这两种直方图的比较,值越大,说明图形越相似
- printf("CV_COMP_CORREL : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL));
- printf("CV_COMP_INTERSECT : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_INTERSECT));
- cvReleaseHist(&Histogram1);
- cvReleaseHist(&Histogram2);
- if (image1->nChannels != 1) {
- cvReleaseImage(&srcImage);
- }
- if (image2->nChannels != 1) {
- cvReleaseImage(&targetImage);
- }
- return 0;
- }
- String srcImage = "d:\\ldh1.jpg";
- String targetImage = "d:\\ldh5.jpg";
- int main(int argc, char* argv[])
- {
- CascadeClassifier cascade;
- namedWindow("image1");
- namedWindow("image2");
- if( !cascade.load( cascadeName ) )
- {
- return -1;
- }
- Mat srcImg, targetImg;
- IplImage* faceImage1;
- IplImage* faceImage2;
- srcImg = imread(srcImage);
- targetImg = imread(targetImage);
- faceImage1 = detect(srcImg, cascade, 1);
- if (faceImage1 == NULL) {
- return -1;
- }
- // cvSaveImage("d:\\face.jpg", faceImage1, 0);
- faceImage2 = detect(targetImg, cascade, 1);
- if (faceImage2 == NULL) {
- return -1;
- }
- // cvSaveImage("d:\\face1.jpg", faceImage2, 0);
- imshow("image1", Mat(faceImage1));
- imshow("image2", Mat(faceImage2));
- CompareHist(faceImage1, faceImage2);
- cvWaitKey(0);
- cvReleaseImage(&faceImage1);
- cvReleaseImage(&faceImage2);
- return 0;
- }
OpenCV学习笔记3:找出人脸,同时比较两张图片中的人脸相似度相关推荐
- delphi 人脸比对_OpenCV学习笔记3:找出人脸,同时比较两张图片中的人脸相似度 | 学步园...
终于到了有实际应用的功能了,有2张图片,里面各有一个人脸,我的目的是比较这两个人脸的相似度,这里用到了facedetect的功能,还有图像转换,图像剪切,以及直方图的比较.具体流程是: 1.分别用fa ...
- 【OpenGL学习笔记⑤】——纹理变换【glm配置+两张图片交替渐变变换 + 纹理平移 + 实现雪花飘落】
- 9月10日OpenCV学习笔记——Mask、彩色直方图、人脸检测
文章目录 前言 一.Mask 二.彩色直方图 三.画出基本图形 四.图片上显示文本 五.人脸检测 前言 本文为9月10日OpenCV学习笔记--Mask.彩色直方图.人脸检测,分为五个章节: Mask ...
- OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己
OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...
- OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope
OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...
- OpenCV学习笔记(一)(二)(三)(四)(五)
OpenCV学习笔记(一) 决心开始研究OpenCV.闲言少叙,sourceforge网站最近的版本是2011年8月的OpenCV2.3.1,下载安装,我这里使用的开发环境是vs2008,网上搜了一下 ...
- OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast
OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...
- OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五
OpenCV学习笔记(五十一)--imge stitching图像拼接stitching stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitch ...
- OpenCV学习笔记(十一)(十二)(十三)(十四)(十五)
OpenCV学习笔记(十一)--谈谈像素的类型和对Templates的限制使用 Templates是c++的一个很强大的特征,可以是数据结构更加安全高效.但也会增加编译时间和代码的长度,当函数被频繁调 ...
最新文章
- SAP 如何将无序列号的库存与序列号关联起来?
- 跨域问题汇总【已收录 CORS JSONP】
- windowswps怎么以文件形式发送_一个招投标项目出现了履约争议,但是没有签订合同,怎么办?...
- CENTOS 7 踢用户_从零学ELK系列(三):Centos安装Docker(超详细图文教程)
- html:(27):类和ID选择器的区别和子选择器
- 开元弧焊机器人编程_【数据】2019年中国焊接机器人市场发展现状与趋势分析...
- linux命令大全_Linux 系统下查看硬件信息命令大全
- 用Python中的tkinter模块作图
- mac系统的UTF-8 BOM编码
- [QNX Hypervisor 2.2用户手册]8.5 vCPU和Hypervisor性能
- 【数理逻辑三】命题逻辑及形式系统【下】
- 滴滴裁员 2000 人,具体补偿方案已出
- Cocos2dx开发手机游戏工具集(持续更新)
- 如何在博客园首页设置卡通人物
- 90个外国英文网站强力推荐 (转)
- 【Axure教程】拖动排序——扣款顺序
- xLua热更新(二)实现热更新
- SSM实训:11、页面插件集成
- Java实现 LeetCode 476 数字的补数
- c++ 如何用一个函数实现两个字符串的比较
热门文章
- Python学生管理系统代码
- SQL 去除字符串空格
- 51单片机常用辅助软件
- 18135usm_更快更安静 佳能18-135mm USM镜头解析
- java中parent结构_详解java中继承关系类加载顺序问题
- C语言每日一练——第60天:平分7筐鱼
- 数据库驱动mysql-connector-java-5.1.46-bin.jar下载及在idea中导入该jar包
- 实现平衡二叉树(AVL树)的旋转
- 康奈尔大学计算机科学人工智能,【录取捷报】2018康奈尔大学本科计算机科学专业offer!...
- 安装pyqt5及软件打包