加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读