人脸识别之一图像采集及人脸库的建立

人脸识别之第一步,人脸库的建立。

在官方文档中,提供一个人脸库的下载,可以下载回来看看人家的是什么格式的。

我们选择AT&T人脸库下载的下载:http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html

AT&T Facedatabase又称ORL人脸数据库,40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。

下载回来的是压缩包,先解压得到orl_faces文件夹,文件夹下有40个文件夹,命名从“s1”~"s40",每个文件夹放的是同一人的照片,里面有10张人脸照。

但都是 .pgm 格式的 92 x 112 图片,在windows下打不开,可在linux下打开,如下:

看一遍官方提供的人脸库,大概知道如何存放、处理图片。后面参考官方方法建立自己的图片即可。

废话少说,马上行动。

一、实现步骤与方法

思路很清晰,如下:

1、打开摄像头,采集图像;

2、加载人脸分类器;

3、人脸检测,并框出人脸部分并显示图像;

4、在检测到人脸条件下,一键拍照;

5、对人脸部分,调整大小并写成指定目录下的图像文件;

二、实现代码

你可自己写代码实现这功能,亦可直接COPY代码来用,这只是辅助功能而已。

代码如下:

#include "opencv2/objdetect.hpp"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;

int resize_save(Mat& faceIn, char *path, int FaceSeq);
int get_face(char *path);

int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("usage: %s <path>\n", argv[0]);
return -1;
}

get_face(argv[1]);

return 0;
}

int get_face(char *path)
{
CascadeClassifier face_cascade;
VideoCapture camera;
char key = 0;
Mat frame;
int ret = 0;
int faceNum = 1;
vector<Rect> faces;
Mat img_gray;
Mat faceImg;

camera.open(0); // 打开摄像头
if(!camera.isOpened())
{
cout << "open camera failed. " << endl;
return -1;
}
cout << "open camera succeed. " << endl;

// 加载人脸分类器
ret = face_cascade.load("/root/library/opencv/opencv-3.2.0/data/haarcascades/haarcascade_frontalface_alt2.xml");
if( !ret )
{
printf("load xml failed.\n");
return -1;
}
cout << "load xml succeed. " << endl;

while (1)
{
camera >> frame;
if(frame.empty())
{
continue;
}

cvtColor(frame, img_gray, COLOR_BGR2GRAY);
equalizeHist(img_gray, img_gray);

// 检测目标
face_cascade.detectMultiScale(img_gray, faces, 1.1, 3, 0, Size(50, 50));

for(size_t i =0; i<faces.size(); i++)
{
/* 画矩形框出目标 */
rectangle(frame, Point(faces[0].x, faces[0].y), Point(faces[0].x + faces[0].width, faces[0].y + faces[0].height),
Scalar(0, 255, 0), 1, 8);
}
imshow("camera", frame); // 显示
key = waitKey(1); // 显示后要添加延时

switch (key)
{
case ‘p‘: // 按 P 一键拍脸
// 只限定检测一个人脸
if(faces.size() == 1)
{
faceImg = frame(faces[0]);
ret = resize_save(faceImg, path, faceNum); // 调整大小及保存
if(ret == 0)
{
printf("resize_save success.\n");
faceNum ++;
}
}
break;

case 27: // 按 Esc 键退出
cout << "Esc..." << endl;
return 0;

default:
break;
}
}
}

int resize_save(Mat& faceIn, char *path, int FaceSeq)
{
string strName;
Mat image;
Mat faceOut;
int ret;

if(faceIn.empty())
{
printf("faceIn is empty.\n");
return -1;
}

if (faceIn.cols > 100)
{
resize(faceIn, faceOut, Size(92, 112)); // 调整大小,这里选择与官方人脸库图片大小兼容
strName = format("%s/%d.jpg", path, FaceSeq); // 先要创建文件夹
ret = imwrite(strName, faceOut); // 文件名后缀要正确 .jpg .bmp ...
if(ret == false) // 出现错误,请检测文件名后缀、文件路径是否存在
{
printf("imwrite failed!\n");
printf("please check filename[%s] is legal ?!\n", strName.c_str());
return -1;
}
imshow(strName, faceOut);
}
waitKey(20);

return 0;
}

操作说明:

编译成功后,执行可执行文件须提供参数,该参数为存放人脸图像的目录,且须为已有目录。

按“P”键一键拍照取脸保存,按“Esc”键退出。

若执行 imwrite() 函数失败时,请检查参数目录是否存在,要保存的文件名后缀是否合法。

此程序保存为 .jpg 格式,命名采用编号法由1递增。

---------------------
作者:曾哥哥_zeng
来源:CSDN
原文:https://blog.csdn.net/qq_30155503/article/details/79776485

原文地址:https://www.cnblogs.com/lx17746071609/p/10981141.html

时间: 2024-08-30 16:06:17

人脸识别之一图像采集及人脸库的建立的相关文章

Android 实现人脸识别教程[运用虹软人脸识别SDK]

基于虹软人脸识别引擎,在Android平台上实现人脸识别功能,即使在离线的情况下依旧运行,不被人采集个人照片的感觉,还是爽爽的.经过整个测试过来,虹软的人脸识别还是很强大的,人脸检测可以控制在20ms之内,人脸识别大概在200ms左右.今天就来分享一下开发经验 项目的目标 我们需要实现一个人脸识别功能.简单来说,就是机的后置摄像头,识别摄像头中实时拍到的人脸信息,如果人库注册过,则显示识别后的人脸信息,如登记的名字:如果不在,提示未注册. 这个功能具有多个应用场景,比如,火车站或者打卡和门禁系统

opencv实现人脸识别(二) 人脸图像采集模块

这一步我们开始搭建第一个模块,用来检测到图像中的人脸位置,并将它拍下来保存在指定路径 流程图: 代码实现: import cv2 def pic(cam): # 调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2 cam = cv2.VideoCapture(0) # 使用自带的人脸识别分类器, 其中 这个.xml文件是 识别人脸的分类器文件 # 这里我已经把这个文件放在了当前项目目录下 face_detector = cv2.CascadeClassifier('haa

系统人脸识别:解决系统人脸识别得到的图片方向问题

1.最后获得的图像反向转换 int height = CVPixelBufferGetHeight(pixelBuffer); CGAffineTransform transform = CGAffineTransformMakeScale(1, -1); transform = CGAffineTransformTranslate(transform, 0, -1 * height); /* Do your face detection */ CGRect faceRect = CGRectA

人脸识别(face recognition)

一.前述 1. 发展 以往的人脸识别主要是包括人脸图像采集.人脸识别预处理.身份确认.身份查找等技术和系统.现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测.行人跟踪.甚至到了动态物体的跟踪.由此可以看出,人脸识别系统已经由简单的图像处理发展到了视频实时处理.而且算法已经由以前的Adaboots.PCA等传统的统计学方法转变为CNN.RCNN等深度学习及其变形的方法.现在也有相当一部分人开始研究3维人脸识别识别,这种项目目前也受到了学术界.工业界和国家的支持. 之后的内容主要参考了下面的链接,

实验报告: 人脸识别方法回顾与实验分析 【OpenCV测试方法源码】

趁着还未工作,先把过去做的东西整理下出来~   Github源码:https://github.com/Blz-Galaxy/OpenCV-Face-Recognition (涉及个人隐私,源码不包含测试样本,请谅解~) 对实验结果更感兴趣的朋友请直接看 第5章 [摘要]这是一篇关于人脸识别方法的实验报告.报告首先回顾了人脸识别研究的发展历程及基本分类:随后对人脸识别技术方法发展过程中一些经典的流行的方法进行了详细的阐述:最后作者通过设计实验对比了三种方法的识别效果并总结了人脸识别所面临的困难与

人脸识别

一:发展历程 人脸识别系统的研究始于20世纪60年代,80年代后随着计算机技术和光学成像技术的发展得到提高,而真正进入初级的应用阶段则在90年后期,并且以美 国.德国和日本的技术实现为主:人脸识别系统成功的关键在于是否拥有尖端的核心算法,并使识别结果具有实用化的识别率和识别速度:“人脸识别系统”集成了 人工智能.机器识别.机器学习.模型理论.专家系统.视频图像处理等多种专业技术,同时需结合中间值处理的理论与实现,是生物特征识别的最新应用,其核心 技术的实现,展现了弱人工智能向强人工智能的转化.

基于 OpenCV 的人脸识别

基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有 OpenCV 的身影. OpenCV 起始于 1999 年 Intel 的一个内部研究项目.从那时起,它的开发就一直很活跃.进化到现在,它已支持如 OpenCL 和 OpenGL 的多种现代技术,也支持如 iOS

纯前端实现人脸识别-提取-合成

原文地址前端路上, 转载请注明出处. 最近火爆朋友圈的军装照H5大家一定还记忆犹新,其原理是先提取出照片中的面部,然后与模板进行合成,官方的合成处理据说由天天P图提供技术支持,后端合成后返回给前端展示,形式很新颖效果也非常好,整个流程涉及的人脸识别和图像合成两项核心技术在前端都有对应的解决方案,因此理论上前端也可以完成人脸识别-提取-合成整个流程,实现纯前端的军装照H5效果. 前端人脸识别 首先需要的是人脸识别,这个一听就觉得高大上的东西原理并不深奥,无非是用人的面部特征规则对图像进行匹配和识别

opencv 人脸识别

背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有 OpenCV 的身影. OpenCV 起始于 1999 年 Intel 的一个内部研究项目.从那时起,它的开发就一直很活跃.进化到现在,它已支持如 OpenCL 和 OpenGL 等现代技术,也支持如 iOS 和 Android 等平台. 1999