opencv检测人脸

#include "cv.h"               
#include "highgui.h"    
   
int main()    
{    
 //读取摄像头    
   //声明IplImage指针    
  IplImage* pFrame = NULL;     
   
  CvCapture* pCapture = NULL;    
  IplImage* pgray=NULL;    
  IplImage* pcanny;    
  CvMemStorage* storage=0;    
   
  CvHaarClassifierCascade* cascade=0;    
  char cascadename[100]="D:\\OpenCV2.1\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"; //训练好的级联表可以用于匹配   
  cascade = (CvHaarClassifierCascade*)cvLoad(cascadename,0,0,0);    
  storage = cvCreateMemStorage(0);    
  CvSeq* faces;    
        
  //窗口通过窗口名来标识    
  cvNamedWindow("video", 1);      
   
  pCapture = cvCaptureFromCAM(-1);  //cvCreateCameraCapture(-1);//-1代表打开哪个摄像头都无所谓或只有一个摄像头  
   
       
  bool first=true;    
  while(pFrame = cvQueryFrame( pCapture ))    
  {    
      if(first)//初次循环,做些初始化    
      {    
         first=false;    
         //创建单通道图片     
         pgray=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);    
         //这是canny边缘监测,和我原来做的差分得边缘不是一个级别的    
         pcanny=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);             
      }    
      //将彩色图转化为2值图    
      cvCvtColor(pFrame,pgray,CV_BGR2GRAY);    
      cvCanny(pgray,pcanny,30,100,3);        //canny边缘检测     
          
      /*********************************/     
      //检测人脸,    
      faces = cvHaarDetectObjects(pgray,cascade,    
                                         storage,1.1,2,0    
                                         ,cvSize(30,30));    
      for(short i=0;i<(faces?faces->total:0);i++)    
      {                                     
              //得到人脸的区域     
              CvRect* rect = (CvRect*)cvGetSeqElem(faces,i);    
              //在人脸区域画个圆圈    
              CvPoint center;     //中心    
              center.x=rect->x+rect->width/2;    
              center.y=rect->y+rect->height/2;    
              short radius = sqrt(pow(rect->width,2)//半径    
                                  +pow(rect->height,2))/2;    
              CvScalar color={{255,0,0}};  //画圈的颜色    
              cvCircle(pFrame,center,radius,color,3,8,0);    
              /**********************************/     
      }                     
      //显示图像    
      //cvShowImage("video", pcanny);    
              
      cvShowImage("video", pFrame);    
      //延时 ,不然不会显示图像的,应该是扫描太快了    
      if(cvWaitKey(10)>= 0)    
      {    
        break;    
      }    
  }    
  //释放图像    
  cvReleaseImage(&pFrame);    
  cvReleaseImage(&pgray);    
  cvReleaseImage(&pcanny);    
   
  //销毁窗口    
  cvDestroyWindow("video");    
   //释放摄像设备    
   cvReleaseCapture(&pCapture);    
   return 0;     
}   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值