图片人脸检测 (I)【sample改版 人眼检测】

前端之家收集整理的这篇文章主要介绍了图片人脸检测 (I)【sample改版 人眼检测】前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. /face_detect.cpp:定义控制台应用程序的入口点。
  2. //
  3. @H_404_17@
  4. //#include"stdafx.h"
  5. #include"opencv2/objdetect/objdetect.hpp"
  6. @H_404_17@ #include"opencv2/highgui/highgui.hpp"
  7. #include"opencv2/imgproc/imgproc.hpp"
  8. @H_404_17@ #include"opencv2/ml/ml.hpp"
  9. @H_404_17@ #include<iostream>
  10. #include<stdio.h>
  11. usingnamespacestd;
  12. @H_404_17@ namespacecv;
  13. StringcascadeName="./haarcascade_frontalface_alt2.xml";//人脸的训练数据
  14. //StringnestedCascadeName="./haarcascade_eye_tree_eyeglasses.xml";//人眼的训练数据
  15. StringnestedCascadeName="./haarcascade_eye.xml";//人眼的训练数据
  16. voiddetectAndDraw(Mat&img,
  17. CascadeClassifier&cascade,CascadeClassifier&nestedCascade,
  18. @H_404_17@ doublescale)
  19. {
  20. inti=0;
  21. doublet=0;
  22. @H_404_17@ vector<Rect>faces;
  23. conststaticScalarcolors[]={CV_RGB(0,255),
  24. @H_404_17@ CV_RGB(0,128,
  25. CV_RGB(0,255,0),248)"> CV_RGB(255,108); color:inherit; line-height:18px; margin-top:0px!important; margin-right:0px!important; margin-bottom:0px!important; padding:0px 3px 0px 10px!important"> CV_RGB(255,255)};//用不同的颜色表示不同的人脸
  26. Matgray,smallImg(cvRound(img.rows/scale),cvRound(img.cols/scale),CV_8UC1);//将图片缩小,加快检测速度
  27. cvtColor(img,gray,CV_BGR2GRAY);//因为用的是类haar特征,所以都是基于灰度图像的,这里要转换成灰度图像
  28. resize(gray,smallImg,smallImg.size(),INTER_LINEAR);//将尺寸缩小到1/scale,用线性插值
  29. @H_404_17@ equalizeHist(smallImg,smallImg);//直方图均衡
  30. t=(double)cvGetTickCount();//用来计算算法执行时间
  31. //检测人脸
  32. //detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,faces表示检测到的人脸目标序列,1.1表示
  33. //每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大
  34. //小都可以检测到人脸),CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,Size(30,30)为目标的
  35. //最小最大尺寸
  36. @H_404_17@ cascade.detectMultiScale(smallImg,faces,248)"> 1.1,2,0
  37. //|CV_HAAR_FIND_BIGGEST_OBJECT
  38. //|CV_HAAR_DO_ROUGH_SEARCH
  39. @H_404_17@ |CV_HAAR_SCALE_IMAGE
  40. ,108); color:inherit; line-height:18px; margin-top:0px!important; margin-right:0px!important; margin-bottom:0px!important; padding:0px 3px 0px 10px!important"> Size(30,30));
  41. double)cvGetTickCount()-t;//相减为算法执行的时间
  42. printf("detectiontime=%gms\n",t/((double)cvGetTickFrequency()*1000.));
  43. for(vector<Rect>::const_iteratorr=faces.begin();r!=faces.end();r++,i++)
  44. MatsmallImgROI;
  45. vector<Rect>nestedObjects;
  46. @H_404_17@ Pointcenter;
  47. Scalarcolor=colors[i%8];
  48. intradius;
  49. center.x=cvRound((r->x+r->width*0.5)*scale);//还原成原来的大小
  50. @H_404_17@ center.y=cvRound((r->y+r->height*0.5)*scale);
  51. radius=cvRound((r->width+r->height)*0.25*scale);
  52. @H_404_17@ circle(img,center,radius,color,3,8,0);
  53. //检测人眼,在每幅人脸图上画出人眼
  54. if(nestedCascade.empty())
  55. continue;
  56. smallImgROI=smallImg(*r);
  57. //和上面的函数功能一样
  58. @H_404_17@ nestedCascade.detectMultiScale(smallImgROI,nestedObjects,0); background-color:inherit">//|CV_HAAR_DO_CANNY_PRUNING
  59. |CV_HAAR_SCALE_IMAGE
  60. @H_404_17@ ,248)"> Size(30,30));
  61. for(vector<Rect>::const_iteratornr=nestedObjects.begin();nr!=nestedObjects.end();nr++)
  62. center.x=cvRound((r->x+nr->x+nr->width*0.5)*scale);
  63. center.y=cvRound((r->y+nr->y+nr->height*0.5)*scale);
  64. @H_404_17@ radius=cvRound((nr->width+nr->height)*0.25*scale);
  65. circle(img,0);//将眼睛也画出来,和对应人脸的图形是一样的
  66. @H_404_17@ }
  67. }
  68. @H_404_17@ cv::imshow("result",img);
  69. intmain(intargc,constchar**argv)
  70. Matimage;
  71. CascadeClassifiercascade,nestedCascade;//创建级联分类器对象
  72. doublescale=1.3;
  73. //image=imread("lena.jpg",1);//读入lena图片
  74. image=imread("0055.jpg",1);
  75. @H_404_17@ namedWindow("result",1);//opencv2.0以后用namedWindow函数自动销毁窗口
  76. if(!cascade.load(cascadeName))//从指定的文件目录中加载级联分类
  77. cerr<<"ERROR:Couldnotloadclassifiercascade"<<endl;
  78. return0;
  79. if(!nestedCascade.load(nestedCascadeName))
  80. cerr<<"WARNING:Couldnotloadclassifiercascadefornestedobjects"<<endl;
  81. if(!image.empty())//读取图片数据不能为空
  82. detectAndDraw(image,cascade,nestedCascade,scale);
  83. waitKey(0);
  84. return0;
  85. }

猜你在找的XML相关文章