opencv 人脸识别 (一)训练样本的处理

摘要:
本文实现基于eigenface的人脸检测与识别。给定一个图像数据库,进行以下步骤:进行人脸检测,将检测出的人脸存入数据库2对数据库2进行人脸建模在测试集上进行recognition本篇实现第一步:进行人脸检测,将检测出的人脸存入数据库2环境:vs2010+opencv2.4.6.0特征:eigenfaceInput:一个人脸数据库,15个人,每人20个样本(左右)。===============================本文完成第一步,数据预处理:自动检测所有文件夹中每个sample中的人脸,作为训练数据。

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

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

环境:vs2010+opencv 2.4.6.0

特征:eigenface

Input:一个人脸数据库,15个人,每人20个样本(左右)。

Output:人脸检测,并识别出每张检测到的人脸。

===============================

本文完成第一步,数据预处理:自动检测所有文件夹中每个sample中的人脸,作为训练数据。

Input:一个color文件夹,每个文件夹中有1~N这N个子文件夹,每个子文件夹内有n张包括第n类人的照片,如图。

opencv 人脸识别 (一)训练样本的处理第1张

最终结果:

opencv 人脸识别 (一)训练样本的处理第2张

核心:face detection(detectAndDraw)

辅助:截图并保存部分图片(CutImg),文件夹内图片遍历(read_img),图片转换成相同大小(normalizeone)

括号内分别是函数名,下面分别给出代码及说明。

1. 遍历文件夹:CBrowseDir类和CStatDir类(具体见这篇),三个文件如下:

1.1 BrowseDir.h

  1. #pragmaonce
  2. #include"direct.h"
  3. #include"string.h"
  4. #include"io.h"
  5. #include"stdio.h"
  6. #include<vector>
  7. #include<iostream>
  8. usingnamespacestd;
  9. classCBrowseDir
  10. {
  11. protected:
  12. charm_szInitDir[_MAX_PATH];
  13. public:
  14. CBrowseDir();
  15. boolSetInitDir(constchar*dir);
  16. boolBeginBrowse(constchar*filespec);
  17. vector<char*>BeginBrowseFilenames(constchar*filespec);
  18. protected:
  19. boolBrowseDir(constchar*dir,constchar*filespec);
  20. vector<char*>GetDirFilenames(constchar*dir,constchar*filespec);
  21. virtualboolProcessFile(constchar*filename);
  22. virtualvoidProcessDir(constchar*currentdir,constchar*parentdir);
  23. };

1.2 BrowseDir.cpp

  1. #include"BrowseDir.h"
  2. #include"direct.h"
  3. #include"string.h"
  4. #include"io.h"
  5. #include"stdio.h"
  6. #include<vector>
  7. #include<iostream>
  8. usingnamespacestd;
  9. CBrowseDir::CBrowseDir()
  10. {
  11. getcwd(m_szInitDir,_MAX_PATH);
  12. intlen=strlen(m_szInitDir);
  13. if(m_szInitDir[len-1]!='\')
  14. strcat(m_szInitDir,"\");
  15. }
  16. boolCBrowseDir::SetInitDir(constchar*dir)
  17. {
  18. if(_fullpath(m_szInitDir,dir,_MAX_PATH)==NULL)
  19. returnfalse;
  20. if(_chdir(m_szInitDir)!=0)
  21. returnfalse;
  22. intlen=strlen(m_szInitDir);
  23. if(m_szInitDir[len-1]!='\')
  24. strcat(m_szInitDir,"\");
  25. returntrue;
  26. }
  27. vector<char*>CBrowseDir::BeginBrowseFilenames(constchar*filespec)
  28. {
  29. ProcessDir(m_szInitDir,NULL);
  30. returnGetDirFilenames(m_szInitDir,filespec);
  31. }
  32. boolCBrowseDir::BeginBrowse(constchar*filespec)
  33. {
  34. ProcessDir(m_szInitDir,NULL);
  35. returnBrowseDir(m_szInitDir,filespec);
  36. }
  37. boolCBrowseDir::BrowseDir(constchar*dir,constchar*filespec)
  38. {
  39. _chdir(dir);
  40. longhFile;
  41. _finddata_tfileinfo;
  42. if((hFile=_findfirst(filespec,&fileinfo))!=-1)
  43. {
  44. do
  45. {
  46. if(!(fileinfo.attrib&_A_SUBDIR))
  47. {
  48. charfilename[_MAX_PATH];
  49. strcpy(filename,dir);
  50. strcat(filename,fileinfo.name);
  51. cout<<filename<<endl;
  52. if(!ProcessFile(filename))
  53. returnfalse;
  54. }
  55. }while(_findnext(hFile,&fileinfo)==0);
  56. _findclose(hFile);
  57. }
  58. _chdir(dir);
  59. if((hFile=_findfirst("*.*",&fileinfo))!=-1)
  60. {
  61. do
  62. {
  63. if((fileinfo.attrib&_A_SUBDIR))
  64. {
  65. if(strcmp(fileinfo.name,".")!=0&&strcmp
  66. (fileinfo.name,"..")!=0)
  67. {
  68. charsubdir[_MAX_PATH];
  69. strcpy(subdir,dir);
  70. strcat(subdir,fileinfo.name);
  71. strcat(subdir,"\");
  72. ProcessDir(subdir,dir);
  73. if(!BrowseDir(subdir,filespec))
  74. returnfalse;
  75. }
  76. }
  77. }while(_findnext(hFile,&fileinfo)==0);
  78. _findclose(hFile);
  79. }
  80. returntrue;
  81. }
  82. vector<char*>CBrowseDir::GetDirFilenames(constchar*dir,constchar*filespec)
  83. {
  84. _chdir(dir);
  85. vector<char*>filename_vec;
  86. filename_vec.clear();
  87. longhFile;
  88. _finddata_tfileinfo;
  89. if((hFile=_findfirst(filespec,&fileinfo))!=-1)
  90. {
  91. do
  92. {
  93. if(!(fileinfo.attrib&_A_SUBDIR))
  94. {
  95. char*filename=newchar[_MAX_PATH];
  96. strcpy(filename,dir);
  97. //intst=0;while(dir[st++]!='

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux Mint 18.2 安装和修改字体phpmyadmin误删表后的恢复过程(心惊胆跳啊)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android 虹软免费人脸识别 SDK开发

目前我们的应用内使用了 ArcFace 的人脸检测功能,其他的我们并不了解,所以这里就和大家分享一下我们的集成过程和一些使用心得集成ArcFace FD 的集成过程非常简单在 ArcFace FD 的文档上有说明支持的系统为 5.0 及以上系统,但其实在 4.4 系统上也是可以跑的, if (engine == null) { // &&...

【论文笔记】深度人脸识别综述

论文题目:《Deep Face Recognition: A Survey》 论文作者:Mei Wang, Weihong Deng 论文链接:http://cn.arxiv.org/pdf/1804.06655.pdf 随着2012年AlexNet赢得了ImageNet挑战赛的冠军后,深度学习技术在各个领域都发挥着重要的作用,极大地提升了许多任务的S...

Android打开相机进行人脸识别,使用虹软人脸识别引擎

上一张效果图,渣画质,能看就好 功能说明: 人脸识别使用的是虹软的FreeSDK,包含人脸追踪,人脸检测,人脸识别,年龄、性别检测功能,其中本demo只使用了FT和FR(人脸追踪和人脸识别),封装了开启相机和人脸追踪、识别功能在FaceCameraHelper中。 实现逻辑: 打开相机,监听预览数据回调进行人脸追踪,且为每个检测到的人脸都分配一个tr...

人脸识别Demo解析C#

概述 不管你注意到没有,人脸识别已经走进了生活的角角落落,钉钉已经支持人脸打卡,火车站实名认证已经增加了人脸自助验证通道,更别提各个城市建设的『智能城市』和智慧大脑了。在人脸识别业界,通常由人脸识别提供商和人脸识别应用接入方组成,从头到尾研发人脸识别技术需要极强的专用技术知识和数学算法功底,对于大多数企业来说,选择人工智能AI公司现成的人脸识别技术引擎是一...

虹软人脸识别SDK接入Milvus实现海量人脸快速检索

一、背景 人脸识别是近年来最热门的计算机视觉领域的应用之一,而且现在已经出现了非常多的人脸识别算法,如:DeepID、FaceNet、DeepFace等等。人脸识别被广泛应用于景区、客运、酒店、办公室、工地、小区等场所,极大的方便了人们的生活。在安防领域,人脸识别也展现出巨大的活力,通过人脸识别对摄像头采集的图像进行处理,可以更快的发现可疑人员。 1:1人...

OpenCV 2.4+ C++ 人脸识别

机器学习 机器学习的目的是把数据转换成信息。 机器学习通过从数据里提取规则或模式来把数据转成信息。 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸。 每个节点的正确识别率很高,但正确拒绝率很低。 任一节点判断没有人脸特征则结束运算,宣布不是人脸。 全部节点通过,则宣布是人脸。 工业上,常用人脸识别技术来识别物体。  对图片进行识别...