您的位置:首页 > 编程语言

OpenCV中人脸检测代码实现

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

[cpp]view
plaincopyprint?

#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类库的安装(参考/article/5197081.html

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

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


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

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

[plain]view
plaincopyprint?

tar xf OpenCV-2.3.1.tar.bz2

cd OpenCV-2.3.1

3.终端运行

[plain]view
plaincopyprint?

mkdir build //build目录名称可任意指定,存放路径也可任意

cd build

cmake .. //cmake命令后的参数为OpenCV-2.3.1目录,因为build为OpenCV-2.3.1的子目录,所以这里为".."表示build的父目录

4.依次运行

[plain]view
plaincopyprint?

make

sudo makeinstall

此时编译成功。

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


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

6 运行此命令
sudo
ldconfig


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


[plain]view
plaincopyprint?

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

export PKG_CONFIG_PATH

8 运行例程测试

[plain]view
plaincopyprint?

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: