OpenCV人脸跟踪canny边缘检测

为了学习图像检测技术,把开源的OpenCV拿来研究,刚刚能用它监测人脸位置.

OpenCV的源码和安装包都在Sourceforge中可以搜到:

http://sourceforge.net/projects/opencvlibrary/files/

OpenCV用起来还是很简单的,根据readme把项目包配置好,三个方面:

 1,dll库路径设好环境变量,2,头文件路径设好,3,静态库文件路径设好,就可以调用函数,

而且还提供一套非常好用GUI,用起来跟Matlab差不多.

 

下面贴出用C++实现的人脸跟踪程序

Cpp代码  复制代码  收藏代码
  1. #include "cv.h"              
  2. #include "highgui.h"   
  3.   
  4. int main()   
  5. {   
  6.  //读取摄像头   
  7.    //声明IplImage指针   
  8.   IplImage* pFrame = NULL;    
  9.   
  10.   CvCapture* pCapture = NULL;   
  11.   IplImage* pgray=NULL;   
  12.   IplImage* pcanny;   
  13.   CvMemStorage* storage=0;   
  14.   //cascade 这个是和人脸检测很有关系的,   
  15.   //我猜它可能用了一个神经网络之类的,从一个文件中读取一个   
  16.   //已经训练好的神经网络,天!自己怎么实现啊!   
  17.   CvHaarClassifierCascade* cascade=0;   
  18.   char cascadename[100]="C:\\OpenCV2.1\\data\\haarcascades\\haarcascade_frontalface_alt2.xml";   
  19.   cascade = (CvHaarClassifierCascade*)cvLoad(cascadename,0,0,0);   
  20.   storage = cvCreateMemStorage(0);   
  21.   CvSeq* faces;   
  22.       
  23.   //创建窗口//就这么一句就创建了一个窗口,比Windows Api简单点   
  24.   //窗口通过窗口名来标识   
  25.   cvNamedWindow("video", 1);   
  26.   //cvMoveWindow("video", 30, 0);   
  27.   //打开摄像头或视频流 ,OpenCV居然还支持Real.嗨!什么都让别人做了   
  28.   pCapture = cvCaptureFromCAM(-1);   
  29.   //pCapture = cvCaptureFromFile("E:\\电影\\战争\\卓别林第一部有声喜剧片大独裁者RMVB中文字幕.rm");    
  30.     
  31.   //每次循环从摄像头中读取一帧图片,我用的USB摄像机,条件不太好哦   
  32.   bool first=true;   
  33.   while(pFrame = cvQueryFrame( pCapture ))   
  34.   {   
  35.       if(first)//初次循环,做些初始化   
  36.       {   
  37.          first=false;   
  38.          //创建单通道图片    
  39.          pgray=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);   
  40.          //这是canny边缘监测,和我原来做的差分得边缘不是一个级别的   
  41.          pcanny=cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);            
  42.       }   
  43.       //将彩色图转化为2值图   
  44.       cvCvtColor(pFrame,pgray,CV_BGR2GRAY);   
  45.       cvCanny(pgray,pcanny,30,100,3);        //canny边缘检测    
  46.          
  47.           
  48.       //检测人脸,   
  49.       faces = cvHaarDetectObjects(pgray,cascade,   
  50.                                          storage,1.1,2,0   
  51.                                          ,cvSize(30,30));   
  52.       for(short i=0;i<(faces?faces->total:0);i++)   
  53.       {                                    
  54.               //得到人脸的区域    
  55.               CvRect* rect = (CvRect*)cvGetSeqElem(faces,i);   
  56.               //在人脸区域画个圆圈   
  57.               CvPoint center;     //中心   
  58.               center.x=rect->x+rect->width/2;   
  59.               center.y=rect->y+rect->height/2;   
  60.               short radius = sqrt(pow(rect->width,2)//半径   
  61.                                   +pow(rect->height,2))/2;   
  62.               CvScalar color={{255,0,0}};  //画圈的颜色   
  63.               cvCircle(pFrame,center,radius,color,3,8,0);   
  64.                   
  65.       }                    
  66.       //显示图像   
  67.       //cvShowImage("video", pcanny);   
  68.              
  69.       cvShowImage("video", pFrame);   
  70.       //延时 ,不然不会显示图像的,应该是扫描太快了   
  71.       if(cvWaitKey(10)>= 0)   
  72.       {   
  73.         break;   
  74.       }   
  75.   }   
  76.   //释放图像   
  77.   cvReleaseImage(&pFrame);   
  78.   cvReleaseImage(&pgray);   
  79.   cvReleaseImage(&pcanny);   
  80.   
  81.   //销毁窗口   
  82.   cvDestroyWindow("video");   
  83.    //释放摄像设备   
  84.    cvReleaseCapture(&pCapture);   
  85.    return 0;    
  86. }  
 人脸检测图片:相机不太好,还是能检测到的


OpenCV人脸跟踪canny边缘检测_第1张图片

下面是canny检测图片,检测出来的基本上都是重要的边界,自己做的杂音太多了,没法拿出来.


OpenCV人脸跟踪canny边缘检测_第2张图片



FROM: http://blog.sina.com.cn/s/blog_73ee929c01010yo7.html

你可能感兴趣的:(视频/opencv)