如何从0学习opencv,完成类似人脸检测的毕设

毕业设计:基于OpenCV的人脸识别算法(终稿)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
毕业设计:基于OpenCV的人脸识别算法(终稿)
上传于|0|0|文档简介
&&毕业论文
你可能喜欢利用OpenCV实现人脸检测
&如何在一副图片中检测到人脸,这涉及到计算机图形学中一些非常复杂的计算,如果这些计算都靠程序员自己来编程,那么工作量就相当大。OpenCV全称是Open Computer Vision,是指开放的计算机视觉资源代码,它具有:统一的结构和功能定义、强大的图像和矩阵运算能力、方便灵活的接口等特点,是计算机视觉、图像处理和模式识别等方面进行二次开发的理想工具。它可以在各种版本的Windows下运行,也可以在Linux下运行。OpenCV的源代码是用C和C++所编写且完全开放的,因此具有很好的可移植性,在Microsoft Visual C++ 6.0、Microsoft Visual Studio 2003及Borland C++ BuilderX等环境下均可方便地使用OpenCV所提供的库来进行实际开发。本程序以Visual C++ 2005作为开发环境来介绍。
一、OpenCV在Visual C++ 2005下的安装与配置
1.OpenCV安装
首先到OpenCV的官方网站(http://sourceforge.net/projects/opencvlibrary)下载OpenCV并进行安装,安装过程很简单,只要按照安装向导一步一步进行即可。
2.对Visual C++ 2005进行全局设置
1)打开Visual C++ 2005,选择&Tools(工具) | Options(选项)&菜单项,弹出如图1所示的对话框。
2)在左侧列表框中选择&Projects and Solutions(项目和解决问题方案) | VC++ Directories(VC++目录)&。
3)在&Show directories for(显示以下内容的目录)&下拉列表框中选择&Library Files(库文件)&。
4)在右侧库文件列表框中定位并添加&& OpenCV 安装目录&OpenCVlib& 。
5)在&Show directories for(显示以下内容的目录)&下拉列表框中选择&Include Files(包含文件)&,并在右侧列表框中定位并添加以下路径:
& OpenCV 安装目录&OpenCVcxcoreinclude
& OpenCV 安装目录&OpenCVcvinclude
& OpenCV 安装目录&OpenCVcvauxinclude
& OpenCV 安装目录&OpenCVmlinclude
& OpenCV 安装目录&OpenCVotherlibshighgui
& OpenCV 安装目录&OpenCVotherlibscvcaminclude
& OpenCV 安装目录&OpenCVMicrosoft Platform SDKInclude
【声明】:黑吧安全网()登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱,我们会在最短的时间内进行处理。
上一篇:【】【】opencv 人脸识别 (一)训练样本的处理 - 推酷
opencv 人脸识别 (一)训练样本的处理
本文实现基于eigenface的人脸检测与识别。给定一个图像数据库,进行以下步骤:
进行人脸检测,将检测出的人脸存入数据库2
对数据库2进行人脸建模
在测试集上进行recognition
本篇实现第一步:
进行人脸检测,将检测出的人脸存入数据库2
环境:vs2010+opencv 2.4.6.0
Input:一个人脸数据库,15个人,每人20个样本(左右)。
Output:人脸检测,并识别出每张检测到的人脸。
===============================
本文完成第一步,数据预处理:自动检测所有文件夹中每个sample中的人脸,作为训练数据。
Input:一个color文件夹,每个文件夹中有1~N这N个子文件夹,每个子文件夹内有n张包括第n类人的照片,如图。
最终结果:
核心:face detection(detectAndDraw)
辅助:截图并保存部分图片(CutImg),文件夹内图片遍历(read_img),图片转换成相同大小(normalizeone)
括号内分别是函数名,下面分别给出代码及说明。
1. 遍历文件夹:CBrowseDir类和CStatDir类(具体见这篇),三个文件如下:
1.1 BrowseDir.h
#pragma once
#include "direct.h"
#include "string.h"
#include "io.h"
#include "stdio.h"
class CBrowseDir
protected:
char m_szInitDir[_MAX_PATH];
CBrowseDir();
bool SetInitDir(const char *dir);
bool BeginBrowse(const char *filespec);
vector BeginBrowseFilenames(const char *filespec);
protected:
bool BrowseDir(const char *dir,const char *filespec);
vector GetDirFilenames(const char *dir,const char *filespec);
virtual bool ProcessFile(const char *filename);
virtual void ProcessDir(const char *currentdir,const char *parentdir);
1.2 BrowseDir.cpp
#include "BrowseDir.h"
#include "direct.h"
#include "string.h"
#include "io.h"
#include "stdio.h"
CBrowseDir::CBrowseDir()
getcwd(m_szInitDir,_MAX_PATH);
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
bool CBrowseDir::SetInitDir(const char *dir)
if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
if (_chdir(m_szInitDir) != 0)
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
vectorCBrowseDir:: BeginBrowseFilenames(const char *filespec)
ProcessDir(m_szInitDir,NULL);
return GetDirFilenames(m_szInitDir,filespec);
bool CBrowseDir::BeginBrowse(const char *filespec)
ProcessDir(m_szInitDir,NULL);
return BrowseDir(m_szInitDir,filespec);
bool CBrowseDir::BrowseDir(const char *dir,const char *filespec)
_chdir(dir);
_finddata_
if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
if (!(fileinfo.attrib & _A_SUBDIR))
char filename[_MAX_PATH];
strcpy(filename,dir);
strcat(filename,fileinfo.name);
cout << filename <<
if (!ProcessFile(filename))
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
if ((fileinfo.attrib & _A_SUBDIR))
if (strcmp(fileinfo.name,".") != 0 && strcmp
(fileinfo.name,"..") != 0)
char subdir[_MAX_PATH];
strcpy(subdir,dir);
strcat(subdir,fileinfo.name);
strcat(subdir,"\\");
ProcessDir(subdir,dir);
if (!BrowseDir(subdir,filespec))
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
vector CBrowseDir::GetDirFilenames(const char *dir,const char *filespec)
_chdir(dir);
vectorfilename_
filename_vec.clear();
_finddata_
if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
if (!(fileinfo.attrib & _A_SUBDIR))
char *filename = new char[_MAX_PATH];
strcpy(filename,dir);
//int st = 0; while (dir[st++]!='\0');
strcat(filename,fileinfo.name); //filename[st]='\0';
filename_vec.push_back(filename);
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
if ((fileinfo.attrib & _A_SUBDIR))
if (strcmp(fileinfo.name,".") != 0 && strcmp
(fileinfo.name,"..") != 0)
char subdir[_MAX_PATH];
strcpy(subdir,dir);
strcat(subdir,fileinfo.name);
strcat(subdir,"\\");
ProcessDir(subdir,dir);
return GetDirFilenames(subdir,filespec);
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
return filename_
bool CBrowseDir::ProcessFile(const char *filename)
void CBrowseDir::ProcessDir(const char
*currentdir,const char *parentdir)
1.3 StatDir.h
#pragma once
#include "browsedir.h"
class CStatDir:public CBrowseDir
protected:
int m_nFileC
//保存文件个数
int m_nSubdirC //保存子目录个数
CStatDir()
m_nFileCount=m_nSubdirCount=0;
int GetFileCount()
return m_nFileC
int GetSubdirCount()
return m_nSubdirCount-1;
protected:
virtual bool ProcessFile(const char *filename)
m_nFileCount++;
return CBrowseDir::ProcessFile(filename);
virtual void ProcessDir
(const char *currentdir,const char *parentdir)
m_nSubdirCount++;
CBrowseDir::ProcessDir(currentdir,parentdir);
2. 辅助函数Prehelper.h, Prehelper.cpp:负责返回文件夹内所有图片(read_img),检测人脸(detectAndDraw并可以在原图中画出),截图(CutImg),提取(DetectandExtract)
2.1 Prehelper.h
//preprocessing helper
//@ Author : Rachel-Zhang
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
void normalizeone(const char* dir,IplImage* standard);
void CutImg(IplImage* src, CvRect rect,IplImage* res);
vector detectAndDraw( Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip,bool draw );
IplImage* DetectandExtract(Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip);
int read_img(const string& dir, vector &images);
vector<pair>
read_img(const string& dir);
2.2 Prehelper.cpp
#include "Prehelper.h"
#include "BrowseDir.h"
#include "StatDir.h"
void normalizeone(const char* dir,IplImage* standard)
if (!statdir.SetInitDir(dir))
puts("Dir not exist");
vectorfile_vec = statdir.BeginBrowseFilenames("*.*");
for (i=0;idepth,1);
cvResize(cur_img,standard,CV_INTER_AREA);
//cvCvtColor(standard,cur_gray,CV_RGB2GRAY);
cvNamedWindow("cur_img",CV_WINDOW_AUTOSIZE);
cvNamedWindow("standard",CV_WINDOW_AUTOSIZE);
cvShowImage("cur_img",cur_img);
cvShowImage("standard",standard);
cvWaitKey();
cvSaveImage(file_vec[i],cur_img);
void CutImg(IplImage* src, CvRect rect,IplImage* res)
imgsize.height = rect.
imgsize.width = rect.
cvSetImageROI(src,rect);
cvCopy(src,res);
cvResetImageROI(res);
int read_img(const string& dir, vector &images)
if (!statdir.SetInitDir(dir.c_str()))
cout<<"Direct "<<dir<<"
not exist!"<<
int cls_id = dir[dir.length()-1]-'0';
vectorfile_vec = statdir.BeginBrowseFilenames("*.*");
int i,s = file_vec.size();
for (i=0;i<s;i++)
Mat graymat = imread(file_vec[i],0);
//graymat.reshape(1,1);//flatten to one row
images.push_back(graymat);
vector<pair>
read_img(const string& dir)
vector<pair> Vp;
if (!statdir.SetInitDir(dir.c_str()))
cout<<"Direct "<<dir<<"
not exist!"<<
return Vp;
int cls_id = dir[dir.length()-1]-'0';
vectorfile_vec = statdir.BeginBrowseFilenames("*.*");
int i,s = file_vec.size();
for (i=0;i<s;i++)
pfi.first = file_vec[i];
pfi.second = imread(file_vec[i]);
Vp.push_back(pfi);
return Vp;
vector detectAndDraw( Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip, bool draw )
int i = 0;
double t = 0;
vector faces, faces2;
const static Scalar colors[] =
{ CV_RGB(0,0,255),
CV_RGB(0,128,255),
CV_RGB(0,255,255),
CV_RGB(0,255,0),
CV_RGB(255,128,0),
CV_RGB(255,255,0),
CV_RGB(255,0,0),
CV_RGB(255,0,255)} ;
Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );
cvtColor( img, gray, CV_BGR2GRAY );
resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
equalizeHist( smallImg, smallImg );
t = (double)cvGetTickCount();
cascade.detectMultiScale( smallImg, faces,
|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
//|CV_HAAR_SCALE_IMAGE
Size(30, 30) );
if( tryflip )
flip(smallImg, smallImg, 1);
cascade.detectMultiScale( smallImg, faces2,
|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
//|CV_HAAR_SCALE_IMAGE
Size(30, 30) );
for( vector::const_iterator r = faces2.begin(); r != faces2.end(); r++ )
faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));
t = (double)cvGetTickCount() -
printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
Mat smallImgROI;
vector nestedO
Scalar color = colors[i%8];
double aspect_ratio = (double)r->width/r->
rectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),
cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),
color, 3, 8, 0);
if( nestedCascade.empty() )
smallImgROI = smallImg(*r);
nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
//|CV_HAAR_DO_CANNY_PRUNING
//|CV_HAAR_SCALE_IMAGE
Size(30, 30) );
//draw eyes
for( vector::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ )
center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);
center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);
radius = cvRound((nr->width + nr->height)*0.25*scale);
circle( img, center, radius, color, 3, 8, 0 );
cv::imshow( "result", img );
IplImage* DetectandExtract(Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip)
vector Rvec = detectAndDraw(img,cascade,nestedCascade,scale,tryflip,0);
int i,maxxsize=0,id=-1,
for (i=0;i<Rvec.size();i++)
area = Rvec[i].width*Rvec[i].
if(maxxsizedepth,transimg->nChannels);
CutImg(transimg,Rvec[id],res);
return NULL;
//Detect.cpp
//Preprocessing - Detect, Cut and Save
//@Author : Rachel-Zhang
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "BrowseDir.h"
#include "StatDir.h"
#include "Prehelper.h"
#define CAM 2
#define PHO 1
#define K 5
string cascadeName = "E:/software/opencv2.4.6.0/data/haarcascades/haarcascade_frontalface_alt.xml";
string nestedCascadeName = "E:/software/opencv2.4.6.0/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml";
int main( )
CvCapture* capture = 0;
Mat frame, frameCopy,
string inputN
bool tryflip =
CascadeClassifier cascade, nestedC
double scale = 1.0;
if( !cascade.load( cascadeName ) ||!nestedCascade.load( nestedCascadeName))
cerr << "ERROR: Could not load classifier cascade or nestedCascade" <<//若出现该问题请去检查cascadeName,可能是opencv版本路径问题
return -1;
printf("select the mode of detection: \n1: from picture\t 2: from camera\n");
scanf("%d",&mode);
char** pics = (char**) malloc(sizeof*pics);
/************************************************************************/
detect face and save
/************************************************************************/
cout<<"detect and save..."<<
const char dir[256] = "D:\\Face_recognition\\pic\\";
string cur_
char id[5];
for(i=1; i<=K; i++)
_itoa(i,id,10);
cur_dir.append("color\\");
cur_dir.append(id);
vector<pair> imgs=read_img(cur_dir);
for(j=0;j<imgs.size();j++)
IplImage* res = DetectandExtract(imgs[j].second,cascade,nestedCascade,scale,tryflip);
cvSaveImage(imgs[j].first,res);
正确的输出就是一系列人脸检测时间,且原文件夹内的图片变成了检测出的人脸(如上面结果图所示)。
关于Computer Vision更多的学习资料将继续更新,敬请关注本博客和新浪微博Rachel Zhang
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信