OpenCV3实现人脸识别(两个)-采集要识别的人脸数据
优采云 发布时间: 2020-08-06 22:14前言
1. 上一篇博客文章演示了如何使用OpenCV内置的面部和眼睛级联分类器检测图像中的面部,此处将演示如何打开连接到计算机的相机并检测面部,然后保存照片. 接下来,它将用作面部识别的训练数据.
2. 我的编程环境是Windows 7 64位,IDE是VS2015,配置了OpenCV3.3和OpenCV_Contrib,其中Boost 1.66用于配置文件和目录,因此,如果配置上述环境,则可以阅读博客文章. 我以前写过.
I. 处理官方数据
1. 下载OpenCV的官方面孔数据. 官方人脸数据提供了总共40个人的面孔,这些面孔被分类到文件目录中. 每个人有10个面部数据,格式为pgm. ,无法通过PC上的查看软件打开Pgm格式,但是您可以使用OpenCV编写一个小程序来查看其中的内容. csdn的下载地址是: . 下载后,它看起来像这样:
每个文件夹收录10个面部数据,格式为pgm,大小为92X112.
2. 编写函数以查看每个类别的面部数据. 这里,boost库的文件操作类别用于递归遍历每个子目录中的图像数据并显示它.
(1)功能代码
/显示目标路径下的所有图像
void showImage(string image_path)
{
//判断是事为文件夹
if (!fs::is_directory(image_path))
{
Mat image = imread(image_path);
if (!image.empty())
{
imshow(image_path, image);
waitKey(0);
}
}
else if(fs::is_directory(image_path))
{
fs::recursive_directory_iterator begin_iter(image_path);
fs::recursive_directory_iterator end_iter;
for (; begin_iter != end_iter; begin_iter++)
{
string file_name = begin_iter->path().string();
if (!fs::is_directory(file_name))
{
Mat image = imread(file_name);
if (!image.empty())
{
imshow(file_name, image);
waitKey(30);
}
}
}
}
}
(2)打开一组数据,您可以看到其中的面部,并且正*敏*感*词*有各种角度,因此在输入要识别的面部时,我们可以从官方角度尽可能地学习.
二,采集要识别的人脸数据
采集要识别的面部数据. 您可以从图像集合中检测面部,也可以从USB相机或笔记本计算机随附的相机检测面部. 此处给出的代码是从相机检测面部,然后对其进行拦截,将其更改为与官方面部图像大小相同的数据,然后保存.
1. 使用OpenCV人脸检测级联分类器来检测人脸,如果它检测到当前视频中只有一个人脸,则使用眼睛分类器来检测该人脸是否可以完全检测到两只眼睛,如果可以同时检测到两只眼睛时间,按p键拍照并保存. 保存10张以上的面孔并退出.
<p>void photograph(string save_path,int _cap)
{
int image_number = 0;
if (!face_detector.load(face_path))
{
std::cout