转自

终于到了有实际应用的功能了,有2张图片,里面各有一个人脸,我的目的是比较这两个人脸的相似度,这里用到了facedetect的功能,还有图像转换,图像剪切,以及直方图的比较。具体流程是:

1。分别用facedetect功能将两张图片中的人脸检测出来

2。将人脸部分的图片剪切出来,存到两张只有人脸的图片里。

3。将这两张人脸图片转换成单通道的图像

4。使用直方图比较这两张单通道的人脸图像,得出相似度。

这里对图的要求还是比较高的,光线和姿势不能有差别,脸的垂直或者左右角度偏差就会影响比较,但和两张图片的大小关系不大,本人觉得较适合于证件照的对比。

下面是代码,其中haarcascade_frontalface_alt.xml是OpenCV里facedetect例子用的样本。 比较的是srcImage和targetImage对应的文件.

还有下面是IplImage和Mat混用,纯当熟悉这两个类了。

[cpp] view plaincopy
[cpp] view plaincopy
[cpp] view plaincopy
  1. #include "opencv/cv.hpp"
  2. #include "opencv2/objdetect/objdetect.hpp"
  3. #include "opencv2/highgui/highgui.hpp"
  4. #include "opencv2/imgproc/imgproc.hpp"
  5. #include <iostream>
  6. #include <stdio.h>
  7. using namespace std;
  8. using namespace cv;
  9. String cascadeName = "D:\\OpenCV-2.4.2\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
  10. IplImage* cutImage(IplImage* src, CvRect rect) {
  11. cvSetImageROI(src, rect);
  12. IplImage* dst = cvCreateImage(cvSize(rect.width, rect.height),
  13. src->depth,
  14. src->nChannels);
  15. cvCopy(src,dst,0);
  16. cvResetImageROI(src);
  17. return dst;
  18. }
  19. IplImage* detect( Mat& img, CascadeClassifier& cascade, double scale)
  20. {
  21. int i = 0;
  22. double t = 0;
  23. vector<Rect> faces;
  24. Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );
  25. cvtColor( img, gray, CV_BGR2GRAY );
  26. resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
  27. equalizeHist( smallImg, smallImg );
  28. t = (double)cvGetTickCount();
  29. cascade.detectMultiScale( smallImg, faces,
  30. 1.3, 2, CV_HAAR_SCALE_IMAGE,
  31. Size(30, 30) );
  32. t = (double)cvGetTickCount() - t;
  33. printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
  34. for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
  35. {
  36. IplImage* temp = cutImage(&(IplImage(img)), cvRect(r->x, r->y, r->width, r->height));
  37. return temp;
  38. }
  39. return NULL;
  40. }
  41. //画直方图用
  42. int HistogramBins = 256;
  43. float HistogramRange1[2]={0,255};
  44. float *HistogramRange[1]={&HistogramRange1[0]};
  45. int CompareHist(IplImage* image1, IplImage* image2)
  46. {
  47. IplImage* srcImage;
  48. IplImage* targetImage;
  49. if (image1->nChannels != 1) {
  50. srcImage = cvCreateImage(cvSize(image1->width, image1->height), image1->depth, 1);
  51. cvCvtColor(image1, srcImage, CV_BGR2GRAY);
  52. } else {
  53. srcImage = image1;
  54. }
  55. if (image2->nChannels != 1) {
  56. targetImage = cvCreateImage(cvSize(image2->width, image2->height), srcImage->depth, 1);
  57. cvCvtColor(image2, targetImage, CV_BGR2GRAY);
  58. } else {
  59. targetImage = image2;
  60. }
  61. CvHistogram *Histogram1 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);
  62. CvHistogram *Histogram2 = cvCreateHist(1, &HistogramBins, CV_HIST_ARRAY,HistogramRange);
  63. cvCalcHist(&srcImage, Histogram1);
  64. cvCalcHist(&targetImage, Histogram2);
  65. cvNormalizeHist(Histogram1, 1);
  66. cvNormalizeHist(Histogram2, 1);
  67. // CV_COMP_CHISQR,CV_COMP_BHATTACHARYYA这两种都可以用来做直方图的比较,值越小,说明图形越相似
  68. printf("CV_COMP_CHISQR : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CHISQR));
  69. printf("CV_COMP_BHATTACHARYYA : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_BHATTACHARYYA));
  70. // CV_COMP_CORREL, CV_COMP_INTERSECT这两种直方图的比较,值越大,说明图形越相似
  71. printf("CV_COMP_CORREL : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL));
  72. printf("CV_COMP_INTERSECT : %.4f\n", cvCompareHist(Histogram1, Histogram2, CV_COMP_INTERSECT));
  73. cvReleaseHist(&Histogram1);
  74. cvReleaseHist(&Histogram2);
  75. if (image1->nChannels != 1) {
  76. cvReleaseImage(&srcImage);
  77. }
  78. if (image2->nChannels != 1) {
  79. cvReleaseImage(&targetImage);
  80. }
  81. return 0;
  82. }
  83. String srcImage = "d:\\ldh1.jpg";
  84. String targetImage = "d:\\ldh5.jpg";
  85. int main(int argc, char* argv[])
  86. {
  87. CascadeClassifier cascade;
  88. namedWindow("image1");
  89. namedWindow("image2");
  90. if( !cascade.load( cascadeName ) )
  91. {
  92. return -1;
  93. }
  94. Mat srcImg, targetImg;
  95. IplImage* faceImage1;
  96. IplImage* faceImage2;
  97. srcImg = imread(srcImage);
  98. targetImg = imread(targetImage);
  99. faceImage1 = detect(srcImg, cascade, 1);
  100. if (faceImage1 == NULL) {
  101. return -1;
  102. }
  103. //    cvSaveImage("d:\\face.jpg", faceImage1, 0);
  104. faceImage2 = detect(targetImg, cascade, 1);
  105. if (faceImage2 == NULL) {
  106. return -1;
  107. }
  108. //    cvSaveImage("d:\\face1.jpg", faceImage2, 0);
  109. imshow("image1", Mat(faceImage1));
  110. imshow("image2", Mat(faceImage2));
  111. CompareHist(faceImage1, faceImage2);
  112. cvWaitKey(0);
  113. cvReleaseImage(&faceImage1);
  114. cvReleaseImage(&faceImage2);
  115. return 0;
  116. }

OpenCV学习笔记3:找出人脸,同时比较两张图片中的人脸相似度相关推荐

  1. delphi 人脸比对_OpenCV学习笔记3:找出人脸,同时比较两张图片中的人脸相似度 | 学步园...

    终于到了有实际应用的功能了,有2张图片,里面各有一个人脸,我的目的是比较这两个人脸的相似度,这里用到了facedetect的功能,还有图像转换,图像剪切,以及直方图的比较.具体流程是: 1.分别用fa ...

  2. 【OpenGL学习笔记⑤】——纹理变换【glm配置+两张图片交替渐变变换 + 纹理平移 + 实现雪花飘落】

  3. 9月10日OpenCV学习笔记——Mask、彩色直方图、人脸检测

    文章目录 前言 一.Mask 二.彩色直方图 三.画出基本图形 四.图片上显示文本 五.人脸检测 前言 本文为9月10日OpenCV学习笔记--Mask.彩色直方图.人脸检测,分为五个章节: Mask ...

  4. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  5. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  6. OpenCV学习笔记(一)(二)(三)(四)(五)

    OpenCV学习笔记(一) 决心开始研究OpenCV.闲言少叙,sourceforge网站最近的版本是2011年8月的OpenCV2.3.1,下载安装,我这里使用的开发环境是vs2008,网上搜了一下 ...

  7. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  8. OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五

    OpenCV学习笔记(五十一)--imge stitching图像拼接stitching stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitch ...

  9. OpenCV学习笔记(十一)(十二)(十三)(十四)(十五)

    OpenCV学习笔记(十一)--谈谈像素的类型和对Templates的限制使用 Templates是c++的一个很强大的特征,可以是数据结构更加安全高效.但也会增加编译时间和代码的长度,当函数被频繁调 ...

最新文章

  1. SAP 如何将无序列号的库存与序列号关联起来?
  2. 跨域问题汇总【已收录 CORS JSONP】
  3. windowswps怎么以文件形式发送_一个招投标项目出现了履约争议,但是没有签订合同,怎么办?...
  4. CENTOS 7 踢用户_从零学ELK系列(三):Centos安装Docker(超详细图文教程)
  5. html:(27):类和ID选择器的区别和子选择器
  6. 开元弧焊机器人编程_【数据】2019年中国焊接机器人市场发展现状与趋势分析...
  7. linux命令大全_Linux 系统下查看硬件信息命令大全
  8. 用Python中的tkinter模块作图
  9. mac系统的UTF-8 BOM编码
  10. [QNX Hypervisor 2.2用户手册]8.5 vCPU和Hypervisor性能
  11. 【数理逻辑三】命题逻辑及形式系统【下】
  12. 滴滴裁员 2000 人,具体补偿方案已出
  13. Cocos2dx开发手机游戏工具集(持续更新)
  14. 如何在博客园首页设置卡通人物
  15. 90个外国英文网站强力推荐 (转)
  16. 【Axure教程】拖动排序——扣款顺序
  17. xLua热更新(二)实现热更新
  18. SSM实训:11、页面插件集成
  19. Java实现 LeetCode 476 数字的补数
  20. c++ 如何用一个函数实现两个字符串的比较

热门文章

  1. Python学生管理系统代码
  2. SQL 去除字符串空格
  3. 51单片机常用辅助软件
  4. 18135usm_更快更安静 佳能18-135mm USM镜头解析
  5. java中parent结构_详解java中继承关系类加载顺序问题
  6. C语言每日一练——第60天:平分7筐鱼
  7. 数据库驱动mysql-connector-java-5.1.46-bin.jar下载及在idea中导入该jar包
  8. 实现平衡二叉树(AVL树)的旋转
  9. 康奈尔大学计算机科学人工智能,【录取捷报】2018康奈尔大学本科计算机科学专业offer!...
  10. 安装pyqt5及软件打包