vs2012+opencv2.4.7 实现单张人脸识别
参考:http://blog.sina.com.cn/s/blog_593c85f20100ncnj.html
OpenCV的库中带有检测正面人脸的 Haar迭代算法Haar Cascade Face Detector (also known as the Viola-Jones method)。Shervin Emami在他的blog(http://www.shervinemami./introToOpenCV.html)中介绍了相关function的使用。他的检测代码教简单快速,但是没有提供直观的人脸检测后识别人脸的矩形框图,因此,下面结合他的程序加入检测后图像显示功能,可较为直观感受OpenCV带来的便捷。
如何新建一个工程和C++文件,已在《OpenCV入门一:安装配置(with VC++ 2008/2010 Express)》中介绍过,这里不再重复。建好所需的工程和C++文件后,按照下面几个步骤,课生成如图一所示的人脸检测图像:
步骤一:C++代码
新建faceDetector工程,任意取名其中包含的C++文件名,实用下列代码:
#include <stdio.h> // For printf()
#include <cv.h> // Main OpenCV library.
#include <highgui.h> // OpenCV functions for files and graphical windows. using namespace std;
using namespace cv; // Initialize a sub funcion using after main
CvRect detectFaceInImage( IplImage *inputImg, CvHaarClassifierCascade* cascade); int main(int argc, char* argv[])
{
CvPoint pt1, pt2; // For draw rectangle
// Check the input is correct when call executable file
if (argc != 2)
{
printf("Usage: faceDetector.exe <imagename>\n");
exit(-1);
} char * imgName = argv[1]; // Copy the second input as the image name
// Load image
IplImage* inputImg = cvLoadImage(imgName, CV_LOAD_IMAGE_UNCHANGED);
if (!inputImg) {
printf("Error: Could not open the image file! \n");
exit(-1);
} // Haar Cascade file, used for Face Detection.
// Note: you could change this directory as your installed OpenCV2.1 location
char *faceCascadeFilename = "C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml";
// Load the HaarCascade classifier for face detection.
CvHaarClassifierCascade* faceCascade;
faceCascade = (CvHaarClassifierCascade*)cvLoad(faceCascadeFilename, 0, 0, 0);
if( !faceCascade ) {
printf("Couldnt load Face detector '%s'\n", faceCascadeFilename);
exit(-1);
} // Perform face detection on the input image, using the given Haar classifier
CvRect faceRect = detectFaceInImage(inputImg, faceCascade);
// Make sure a valid face was detected then draw the rect location.
if (faceRect.width > 0)
{
printf("Detected a face at (%d,%d)!\n", faceRect.x, faceRect.y); // Get the pointer of the face rectangle
pt1.x = faceRect.x;
pt2.x = faceRect.x + faceRect.width;
pt1.y = faceRect.y;
pt2.y = faceRect.y + faceRect.height; // Draw the rectangle in the input image
cvRectangle( inputImg, pt1, pt2, CV_RGB(255,0,0), 2, 8, 0 ); // Show the detected face image on the screen.
cvNamedWindow("Detected face", CV_WINDOW_AUTOSIZE);
// Show the image in the window named "Detected face", you could change as you like
cvShowImage( "Detected face", inputImg ); // Wait for the user to press something on the graphical window.
// Note: cvWaitKey() is needed for time to draw on the screen.
cvWaitKey(0); // Free the resources.
cvDestroyWindow("Detected face");
cvReleaseImage( &inputImg );
} // Free the Face Detector resources when the program is finished
cvReleaseHaarClassifierCascade( &faceCascade );
return 0;
} // Perform face detection on the input image, using the given Haar Cascade.
// Returns a rectangle for the detected region in the given image.
CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade)
{
// Smallest face size.
CvSize minFeatureSize = cvSize(20, 20);
// Only search for 1 face.
int flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH;
// How detailed should the search be.
float search_scale_factor = 1.1f;
IplImage *detectImg;
IplImage *greyImg = 0;
CvMemStorage* storage;
CvRect rc;
//double t;
CvSeq* rects;
CvSize size;
int nFaces;
//int i, ms;
storage = cvCreateMemStorage(0);
cvClearMemStorage( storage ); // If the image is color, use a greyscale copy of the image.
detectImg = (IplImage*)inputImg;
if (inputImg->nChannels > 1) {
size = cvSize(inputImg->width, inputImg->height);
greyImg = cvCreateImage(size, IPL_DEPTH_8U, 1 );
cvCvtColor( inputImg, greyImg, CV_BGR2GRAY );
detectImg = greyImg; // Use the greyscale image.
} // Detect all the faces in the greyscale image.
//t = (double)cvGetTickCount();
rects = cvHaarDetectObjects( detectImg, cascade, storage,
search_scale_factor, 3, flags, minFeatureSize);
//t = (double)cvGetTickCount() - t;
//ms = cvRound( t / ((double)cvGetTickFrequency() * 1000.0) );
nFaces = rects->total;
//printf("Face Detection took %d ms and found %d objects\n", ms, nFaces);
// Get the first detected face (the biggest).
if (nFaces > 0)
rc = *(CvRect*)cvGetSeqElem( rects, 0 );
else
rc = cvRect(-1,-1,-1,-1); // Couldn't find the face. if (greyImg)
{
cvReleaseImage( &greyImg );
}
cvReleaseMemStorage( &storage );
return rc; // Return the biggest face found, or (-1,-1,-1,-1).
}
步骤二:编译(只是编译 ,这一步还看不到图片)
如果编译出错,比如找不到cv打头的function(比如CvHaarClassifierCascade等),或者找不到头文件、资源文件等,都有可能是工程配置不对。请参考之前提到的配置文章查看自己的配置。
Debug之后,在此新建工程中Debug文件夹里找到可执行文件。如果你新建的工程名是faceDetector,无论你的C++文件名是什么,debug之后可执行文件的名字都是faceDetector.exe。
步骤三:调用可执行文件
Start -> Run 在输入框中输入 cmd 然后回车,出现dos命令行窗口。
按图二所示,输入faceDetector工程Debug文件夹的地址,输入 “可执行文件名(红色框内)图片名”,然后回车,就会得到检测出人脸的图像(图一)以及图中矩形框左上角的其实坐标。
注意: 需要依赖的lib库如下 项目/属性/连接器
opencv_core247d.lib
opencv_highgui247d.lib
opencv_imgproc247d.lib
opencv_features2d247d.lib
opencv_calib3d247d.lib
opencv_objdetect247d.lib
vs2012+opencv2.4.7 实现单张人脸识别的更多相关文章
- OpenCV-2.4.6-android-sdk 人脸识别demo搭建
最近项目需要研究下人脸识别,在领导推荐下准备研究OpenCV 一,上官网了解下 基本知识 http://docs.opencv.org/doc/tutorials/introduction/andro ...
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的 ...
- OpenCV人脸识别Eigen算法源码分析
1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...
- OpenCV人脸识别LBPH算法源码分析
1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...
- Opencv摄像头实时人脸识别
Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...
- OpenCV摄像头人脸识别
注: 从外设摄像装置中获取图像帧,把每帧的图片与人脸特征进行匹配,用方框框住识别出来的人脸 需要用到的函数: CvHaarClassifierCascade* cvLoadHaarClassifier ...
- 基于OpenCV的人脸识别[iOS开发笔记(2)]
开始了OpenCV的试水工作了... 1.Get ready 在OpenCV中我们会使用函数cv::CascadeClassifier 来进行人脸检测.但是在使用本函数之前我们需要添加一个XML文件对 ...
- 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】
文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
原地址:http://blog.csdn.net/watkinsong/article/details/7631241 目前因为做人脸识别的一个小项目,用到了AdaBoost的人脸识别算法,因为在网上 ...
随机推荐
- activity和fragment的声明周期
Activity生命周期: Fragment生命周期:
- QQ粘性效果
演示如下 QQ粘性效果.zip
- 什么是CS和BS结构,两种结构的区别
什么是CS和BS结构,两种结构的区别 什么是C/S和B/S结构? C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系 ...
- .Net Core 学习 (1) - ASP.NET Core 总览
什么是ASP.NET 1.0 开源 - GitHub 跨平台 - 支持Windows, Mac, Linux 从底层进行了优化 - 使用最小开销的模块化组件 - 给与了开发人员很大的灵活性 为什么要使 ...
- linux shell if参数
shell 编程中使用到得if语句内判断参数 –b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当path ...
- 错误源:WebForms UnobtrusiveValidationMode requires a ScriptResourceMapping for 'jquery'. Please add a ScriptResourceMapping named jquery(case-sensitive).
Server Error in '/' Application. WebForms UnobtrusiveValidationMode requires a ScriptResourceMapping ...
- Codevs 3289 花匠 2013年NOIP全国联赛提高组
3289 花匠 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 花匠栋栋种了一排花,每株花都 ...
- 暑假集训(2)第六弹 ----- Frosh Week(UVA11858)
H - Frosh Week Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB ...
- [Guava官方文档翻译] 2.使用和避免使用null (Using And Avoiding Null Explained)
本文地址:http://www.cnblogs.com/hamhog/p/3536647.html "null很恶心." -Doug Lea "这是一个令我追悔莫及的错误 ...
- strcpy函数导致release版程序崩溃
最近在写一个读取模型文件的小程序.很随意的使用了strcpy函数进行char字符数组的拷贝,这个数组是需要传递给PostMessage作为WPARAM的参数.代码部分如下: char pStrCurr ...