如何用opencv实现人脸检测与跟踪

如何用opencv实现人脸检测与跟踪,第1张

openCV具备人脸识别的解决方案,但openCV仿佛是一道坎,我始终不能安排跨过这道坎的计划。很早以前在processing官网中找到祥毁毁了Face Detect(这个链接需要代理才能打开)这个为processing提供人脸识别功能的lib,今天终于静下心来仔细阅读了它的说明文档,下面是其基本使用方法说明:首先下载pFaceDetect.zip,在processing的libraries文件夹中新建一个名为pFaceDetect的文件夹,再将压缩包内的library文件夹拷贝到这个文件夹中。其次,Face Detect需要openCV的支持,但并不必须安装openCV到余岩计算谨备机中,只要把openCV的cxcore100.dll 、cv100.dll 、libguide40.dll 三个文件拷贝到processing根目录就行了。pFaceDetect是对PImage对象进行识别,下面的范例中是通过JMyron来获取视频,并将像素信息复制到PImage对象中,因此,运行下面的范例还需要安装JMyron。重启processing,新建一个项目并保存,把压缩包内的data文件夹拷贝到当前项目的存档目录中。不要忘记连接好摄像头。

用Haar人脸检测,能够检测不同大小的多个人脸。以下是主要程序:

static CvMemStorage* storage = 0

static CvHaarClassifierCascade* cascade = 0

const char* cascade_name ="C:\\OpenCV2.0\\data\\haarcascades\\haarcascade_frontalface_alt2.xml" //分类器路径,根据实际情况写

cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 )

storage = cvCreateMemStorage(0)

IplImage *image = cvLoadImage(filenames) //读入灰度图像

CvSeq* faces = cvHaarDetectObjects( image, cascade, storage,1.1, 2, CV_HAAR_DO_CANNY_PRUNING,cvSize(30, 30) ) //人圆誉脸检测函数

int num_of_face=faces->total //这是检测到的人脸的个数

CvRect* r = (CvRect*)cvGetSeqElem( faces, i )//获取每个人脸的信息,返回类蔽腔山型是矩形。i为人脸编号,0,1,2。。。可以用循宏中环读取。

voiddetect_and_draw( IplImage* img )

{

   static CvScalar colors[] =

   {

   // 定义8种不同的颜色

      {{0,0,255}},

  型友   歼租戚 {{0,128,255}},

      {{0,255,255}},

      {{0,255,0}},

      {{255,128,0}},

      {{255,255,0}},

      {{255,0,0}},

      {{255,0,255}}

   }

   double scale = 1.3    // 图像缩放比例

   IplImage*gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 )    // 申请灰度图的存储空间gray,大小为原始图像大小

   IplImage*small_img = cvCreateImage( cvSize( cvRound (img->width/scale),

      cvRound(img->height/scale)), 8, 1 )    // 申请灰度图的存储空间small_img,大小为原始图像缩放scale倍

   cvCvtColor(img, gray, CV_BGR2GRAY )    // 将原始图像转换成灰度图像,保存在gray中

   cvResize(gray, small_img, CV_INTER_LINEAR )    // 将灰度图缩放scale倍,保存在small_img中

   cvEqualizeHist(small_img, small_img )    // 对缩小后的灰度图small_img做直方图均衡

   cvClearMemStorage(storage )    // 为人脸识别分配空间

   if( cascade )

   {

      //函数 cvHaarDetectObjects 检测图像中的目标

      CvSeq*faces = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 2, 0 ,

           cvSize(30,30) )    // 人脸识别,将结果保存到faces中

      for( int i = 0 i< (faces ? faces->total : 0) i++ )

      {

      // 对找到的每一个脸做如下处理:

        CvRect*r = (CvRect*)cvGetSeqElem( faces, i )    // 取出脸的矩形区域,存入r

        CvPointcenter

        int radius

        center.x= cvRound((r->x + r->width*0.5)*scale)    // 计算矩形区域的中心,x坐标

        center.y= cvRound((r->y + r->height*0.5)*scale)    // 计算矩形区域的中心,y坐标

        radius= cvRound((r->width + r->height)*0.25*scale)    // 计算矩形区域的半径radius

        cvCircle(img, center, radius, colors[i%8], 3, 8, 0 )    // 在原始图像上,在上面求得的中心处,以radius为半径,氏陵用colors中的颜色画圆。

      }

   }

   cvShowImage("result", img )    // 显示画好的图片

   cvReleaseImage(&gray )    // 释放开始申请的空间gray 

   cvReleaseImage(&small_img )    // 释放开始申请的空间small_img 

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8257914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存