原文地址:http://blog.csdn.net/sjz_iron/article/details/8560251
声明:本文代码来源于,实现平台为Linux+OpenCV,共分为两部分:人脸检测与人脸识别。本文为前半部分的代码,关于第二部分请参见http://blog.csdn.net/liudekuan/article/details/8560553。话不多言,以下给出代码及相关注解。
-
#include "cv.h"
-
#include "highgui.h"
-
#include
-
-
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.依次运行
此时编译成功。
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。
阅读(1523) | 评论(0) | 转发(0) |