`
westice
  • 浏览: 114171 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

OpenCV人脸跟踪canny边缘检测

阅读更多

 

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

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

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

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

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

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

 

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

#include "cv.h"           
#include "highgui.h"

int main()
{
 //读取摄像头
   //声明IplImage指针
  IplImage* pFrame = NULL; 

  CvCapture* pCapture = NULL;
  IplImage* pgray=NULL;
  IplImage* pcanny;
  CvMemStorage* storage=0;
  //cascade 这个是和人脸检测很有关系的,
  //我猜它可能用了一个神经网络之类的,从一个文件中读取一个
  //已经训练好的神经网络,天!自己怎么实现啊!
  CvHaarClassifierCascade* cascade=0;
  char cascadename[100]="C:\\OpenCV2.1\\data\\haarcascades\\haarcascade_frontalface_alt2.xml";
  cascade = (CvHaarClassifierCascade*)cvLoad(cascadename,0,0,0);
  storage = cvCreateMemStorage(0);
  CvSeq* faces;
   
  //创建窗口//就这么一句就创建了一个窗口,比Windows Api简单点
  //窗口通过窗口名来标识
  cvNamedWindow("video", 1);
  //cvMoveWindow("video", 30, 0);
  //打开摄像头或视频流 ,OpenCV居然还支持Real.嗨!什么都让别人做了
  pCapture = cvCaptureFromCAM(-1);
  //pCapture = cvCaptureFromFile("E:\\电影\\战争\\卓别林第一部有声喜剧片大独裁者RMVB中文字幕.rm"); 
 
  //每次循环从摄像头中读取一帧图片,我用的USB摄像机,条件不太好哦
  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; 
}
 人脸检测图片:相机不太好,还是能检测到的


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


 

  • 大小: 30 KB
  • 大小: 49.1 KB
分享到:
评论
3 楼 jaye 2011-03-26  
你这是识别人脸, 并不是人脸跟踪。

应该看看motion tracking的内容
2 楼 cd1985 2010-05-13  
  曾经看到过 opencv  和  opengl 结合用 very nice!
1 楼 javafound 2010-04-29  
嗯,不错,继续努力,呵呵,

相关推荐

Global site tag (gtag.js) - Google Analytics