haoyul

本文实现基于eigenface的人脸检测与识别。给定一个图像数据库,进行以下步骤:

  • 进行人脸检测,将检测出的人脸存入数据库2
  • 对数据库2进行人脸建模
  • 在测试集上进行recognition
本篇实现第一步:
  • 进行人脸检测,将检测出的人脸存入数据库2

环境:vs2010+opencv 2.4.6.0

特征:LBP

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" 
#include 
#include 
using namespace std;
class CBrowseDir
{
protected:
  char m_szInitDir[_MAX_PATH];

public:
  CBrowseDir();
  bool SetInitDir(const char *dir);
  bool BeginBrowse(const char *filespec);
  vector<char*> BeginBrowseFilenames(const char *filespec);

protected:
  bool BrowseDir(const char *dir,const char *filespec);
  vector<char*> 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" 
#include 
#include 
using namespace std;

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)
    return false;

  if (_chdir(m_szInitDir) != 0)
    return false;
  int len=strlen(m_szInitDir);
  if (m_szInitDir[len-1] != \'\\\')
    strcat(m_szInitDir,"\\");

  return true;
}

vector<char*>CBrowseDir:: 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);
  long hFile;
  _finddata_t fileinfo;
  if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
  {
    do
    {
      if (!(fileinfo.attrib & _A_SUBDIR))
      {
        char filename[_MAX_PATH];
        strcpy(filename,dir);
        strcat(filename,fileinfo.name);
        cout << filename << endl;
        if (!ProcessFile(filename))
          return false;
      }
    } while (_findnext(hFile,&fileinfo) == 0);
    _findclose(hFile);
  }
  _chdir(dir);
  if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
  {
    do
    {
      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))
            return false;
        }
      }
    } while (_findnext(hFile,&fileinfo) == 0);
    _findclose(hFile);
  }
  return true;
}

vector<char*> CBrowseDir::GetDirFilenames(const char *dir,const char *filespec)
{
  _chdir(dir);
  vector<char*>filename_vec;
  filename_vec.clear();

  long hFile;
  _finddata_t fileinfo;
  if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
  {
    do
    {
      if (!(fileinfo.attrib & _A_SUBDIR))
      {
        

分类:

技术点:

相关文章: