Board logo

标题: 基于OpenCV的人脸识别系统设计 [打印本页]

作者: porereading    时间: 2013-1-18 09:36     标题: 基于OpenCV的人脸识别系统设计

人脸识别的研究可以追溯到上个世纪六、七十年代,经过几十年的曲折发展已日趋成熟,构建人脸识别系统需要用到一系列相关技术,包括人脸图像采集、人脸定位、人脸识别预处理、身份确认以及身份查找等 。而人脸识别在基于内容的检索、数字视频处理、视频检测等方面有着重要的应用价值,可广泛应用于各类监控场合,因此具有广泛的应用前景。OpenCV是Intel 公司支持的开源计算机视觉库。它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法,作为一个基本的计算机视觉、图像处理和模式识别的开源项目,OpenCV 可以直接应用于很多领域,其中就包括很多可以应用于人脸识别的算法实现,是作为第二次开发的理想工具。
  1 系统组成
  本文的人脸识别系统在Linux 操作系统下利用QT库来开发图形界面,以OpenCV 图像处理库为基础,利用库中提供的相关功能函数进行各种处理:通过相机对图像数据进行采集,人脸检测主要是调用已训练好的Haar 分类器来对采集的图像进行模式匹配,检测结果利用PCA 算法可进行人脸图像训练与身份识别,而人脸表情识别则利用了Camshift 跟踪算法和Lucas–Kanade 光流算法。
  2 搭建开发环境
  采用德国Basler acA640-100gc 相机,PC 机上的操作系统是Fedora 10,并安装编译器GCC4.3,QT 4.5和OpenCV2.2 软件工具包,为了处理视频,编译OpenCV 前需编译FFmpeg,而FFmpeg 还依赖于Xvid库和X264 库。
  3 应用系统开发
  程序主要流程如图1 所示。

  


  图1 程序流程(visio)


  3.1 图像采集
  图像采集模块可以通过cvCaptureFromAVI()从本地保存的图像文件或cvCaptureFromCam()从相机得到图像,利用cvSetCaptureProperty()可以对返回的结构进行设置:
  IplImage *frame;CvCapture* cAMEra = 0;
  camera = cvCaptureFromCAM( 0 );
  cvSetCaptureProperty(camera,
  CV_CAP_PROP_FRAME_WIDTH, 320 );
  cvSetCaptureProperty(camera,
  CV_CAP_PROP_FRAME_HEIGHT, 240 );
  然后利用start()函数开启QTimer 定时器,每隔一段时间发送信号调用自定义的槽函数,该槽函数用cvGrabFrame()从视频流中抓取一帧图像放入缓存,再利用CvRetrieveFrame()从内部缓存中将帧图像读出用于接下来的处理与显示。在qt 中显示之前,需将IplImage* source 转换为QPixmap 类型。
  uchar *qImageBuffer = NULL;
  /*根据图像大小分配缓冲区*/
  qImageBuffer = (uchar*) malloc(source-》width *
  source-》height * 4 * sizeof(uchar));
  /*将缓冲区指针拷贝到存取Qimage 的指针中*/
  uchar *QImagePtr = qImageBuffer;
  /* 获取源图像内存指针*/Const uchar*
  iplImagePtr=reinterpret_cast/《uchar*》》(source-》imageDat
  a);
  /*通过循环将源图像数据拷贝入缓冲区内*/
  for (int y = 0; y 《 source-》height; ++y){
  for (int x = 0; x 《 source-》width; ++x){
  QImagePtr[0] = iplImagePtr[0];
  QImagePtr[1] = iplImagePtr[1];
  QImagePtr[2] = iplImagePtr[2];
  QImagePtr[3] = 0;
  QImagePtr += 4;
  iplImagePtr += 3; }
  iplImagePtr+=source-》widthStep–3*source-》width; }
  /*将Qimage 转换为Qpixmap*/QPixmap local =
  QPixmap::fromImage(QImage(qImageBuffer,source-》wi
  dth,source-》height, QImage::Format_RGB32));
  /*释放缓冲区*/
  free(qImageBuffer);
  最后利用QLabel 的setPixmap()函数进行显示。
  3.2 图像预处理
  由于大部分的脸部检测算法对光照,脸部大小,位置表情等非常敏感, 当检测到脸部后需利用cvCvtcolor()转化为灰度图像,利用cvEqualizeHist()进行直方图归一化处理。
作者: TLP291    时间: 2013-1-30 14:03

光光耦网——全球光耦资源整合者
原装、现货http://www.tosharp.cn/





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0