OpenCV中人脸检测代码实现

声明:本文代码来源于http://www.cognotics.com/opencv/servo_2007_series/,实现平台为Linux+OpenCV,共分为两部分:人脸检测与人脸识别。本文为前半部分的代码,关于第二部分请参见http://blog.csdn.net/liudekuan/article/details/8560553。话不多言,以下给出代码及相关注解。

#include "cv.h"
#include "highgui.h"
#include <stdio.h>

using namespace cv;

int main(int argc, char** argv)
{
    CvHaarClassifierCascade * pCascade = 0;  // the face detector
    CvMemStorage * pStorage = 0;        // expandable memory buffer
    CvSeq * pFaceRectSeq;               // list of detected faces
    int i;

    // initializations
    IplImage * pInpImg = (argc > 1) ? cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR) : 0;
    pStorage = cvCreateMemStorage(0);
    pCascade = (CvHaarClassifierCascade *)cvLoad
        (("/home/ldk/OpenCV-2.4.3/data/haarcascades/haarcascade_frontalface_alt.xml"), 0, 0, 0 );


    // validate that everything initialized properly
    if( !pInpImg || !pStorage || !pCascade ){
        printf("Initialization failed: %s \n",
            (!pInpImg)?  "didn't load image file" :
            (!pCascade)? "didn't load Haar cascade -- "
                "make sure path is correct" :
            "failed to allocate memory for data storage");
        exit(-1);
    }

    // detect faces in image
    pFaceRectSeq = cvHaarDetectObjects
        (pInpImg, pCascade, pStorage,
        1.1,                       // increase search scale by 10% each pass   
        3,                         // drop groups of fewer than three detections   
        CV_HAAR_DO_CANNY_PRUNING,  // skip regions unlikely to contain a face   
        cvSize(0,0));              // use XML default for smallest search scale

    // create a window to display detected faces
    cvNamedWindow("Haar Window", CV_WINDOW_AUTOSIZE);

    // draw a rectangular outline around each detection
    for(i=0;i<(pFaceRectSeq? pFaceRectSeq->total:0); i++ ){
        CvRect * r = (CvRect*)cvGetSeqElem(pFaceRectSeq, i);
        CvPoint pt1 = { r->x, r->y };
        CvPoint pt2 = { r->x + r->width, r->y + r->height };
        cvRectangle(pInpImg, pt1, pt2, CV_RGB(0,255,0), 3, 4, 0);
    }

    // display face detections
    cvShowImage("Haar Window", pInpImg);
    cvWaitKey(0);
    cvDestroyWindow("Haar Window");

    // clean up and release resources
    cvReleaseImage(&pInpImg);
    if(pCascade) cvReleaseHaarClassifierCascade(&pCascade);
    if(pStorage) cvReleaseMemStorage(&pStorage);
    return 0;
}


相关注解:

代码15行:加载待检测的图像;

代码17-18行:加载人脸特征数据(以xml文件形式存储)。在OpenCV中提供了四个描述正面人脸的数据文件,分别为haarcascade_frontalface_alt.xml,haarcascade_

                frontalface_default.xml,haarcascade_frontalface_alt_tree.xml,haarcascade_frontalface_alt2.xml。除此之外还提供了用以检测人眼区域、上下半身等特征数据;

                其中第18行中的文件存放地址要根据自己的情况进行更改;

代码31-37行:利用cvHaarDetectObjects函数进行人脸检测。显然从此函数名称即可看出,此函数可用以检测图像中的各种物体而不限于人脸。具体检测何种物体则由加载的

                xml特征描述文件决定;

代码42-48行:对检测到的人脸区域进行标注。

代码运行结果如下所示:

 

 

附录:ubuntu中opencv类库的安装(参考http://www.cnblogs.com/JohnShao/archive/2011/09/22/2184653.html

1.首先在终端运行下列命令进行必要的编译环境安装。

sudo apt-get installbuild-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev libtiff4-dev cmake libswscale-dev libjasper-dev

2.下载相应的版本到电脑里面,这里我们以下载OpenCV-2.3.1为例。

cd 命令进入相应的下载目录。依次运行下列命令

tar xf OpenCV-2.3.1.tar.bz2
cd OpenCV-2.3.1

3.终端运行

mkdir build //build目录名称可任意指定,存放路径也可任意
cd build
cmake ..   //cmake命令后的参数为OpenCV-2.3.1目录,因为build为OpenCV-2.3.1的子目录,所以这里为".."表示build的父目录

4.依次运行

make
sudo make install

此时编译成功。

5 现在需要配置必要的库。运行 sudogedit /etc/ld.so.conf.d/opencv.conf

添加这句命令到文件中,/usr/local/lib,文件或许是空的,不影响。

6  运行此命令  sudoldconfig

7 现在运行这条命令 sudogedit /etc/bash.bashrc,添加下面两行到文件的末尾并保存。

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

8 运行例程测试

cd ~
mkdir openCV_samples
cp OpenCV-2.3.1/samples/c/* openCV_samples
cd openCV_samples/
chmod +x build_all.sh
./build_all.sh
./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg

 

在人脸识别过程中,人脸检测只是第一步,后续部分请参见http://blog.csdn.net/liudekuan/article/details/8560553

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include "stdafx.h" #include "cv.h" #include "highgui.h" #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { CvCapture* capture=0; /*初始化一个视频捕获操作。告诉底层的捕获api我想从Capture1.avi捕获图片, 底层api将检测并选择相应的解码器并做好准备工作*/ capture = cvCaptureFromFile( "F:\\1.avi"); //设置要读的视频(avi格式) static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt.xml",0,0,0); if( !cascade || !capture ) return -1; storage = cvCreateMemStorage(0); /*创建一个窗口,用“Video”作为窗口的标识符*/ cvNamedWindow( "Video",1); /*如果初始化失败,那么capture为空指针,程序停止,否则进入捕获循环*/ if( capture ) { for(;;) { IplImage* frame = cvQueryFrame( capture ); IplImage* img = NULL; CvSeq* faces; if( !frame ) break; img = cvCloneImage(frame); img->origin = 0; if( frame->origin ) cvFlip(img,img); cvClearMemStorage( storage ); //目标检测 faces = cvHaarDetectObjects( img, cascade, storage,1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(20, 20) ); for( int i = 0; i < (faces ? faces->total : 0); i++ ) { CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); cvRectangle( img, cvPoint(r->x,r->y), cvPoint(r->x+r->width,r->y+r->height), CV_RGB(255,0,0), 1); } cvShowImage( "Video", img ); //设置每帧图像的间隔 Sleep(50); /*如果你敲了键盘,就退出程序,否则继续捕获下一帧*/ if( cvWaitKey(10)>0 ) break; } /*退出之前结束底层api的捕获操作,比如会使得别的程序无法访问已经被它们打开的文件*/ cvReleaseCapture( &capture;); } /*销毁窗口*/ cvDestroyWindow("Video"); return 0; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值