【Opencv综合应用】自制训练集的人脸识别1——拍摄10张人脸图片

【Opencv综合应用】自制训练集的人脸识别1——拍摄10张人脸图片

疫情期间学校去不了,在家闲着没事,刚好有学校的比赛项目,就趁着机会做一下,顺便学习学习OpenCV
原文转自: https://www.cnblogs.com/fpzs/p/10533485.html.
我的环境与原文不同,我的环境为win10+opencv4.1.0+opencv-contrib4.1.0+VS2017

一:主要步骤

拍摄人脸图片
1、加载人脸检测器
2、打开电脑摄像头,载入视频流,抽取帧,进行灰度化处理
3、识别人脸,采集10张灰度图像并将尺寸变为为92x112保存到文件中(如果想要彩色图像只需要把代码中的imgGray全部改为img即可)

二:代码部分

/****************************************************
拍摄人脸图片:
1、加载人脸检测器
2、打开电脑摄像头,载入视频流,抽取帧,进行灰度化处理
3、识别人脸,采集20张灰度图保存到文件中(如果想要彩色图像只需要把代码中的imgGray全部改为img即可)
*****************************************************/
#include "opencv2/objdetect.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
using namespace cv;

int main()
{
	Mat img;                      //用于存储每一帧的图像
	Mat imgGray;                  //用于存储灰度图
	Mat myFace;                   //用于存储我的人脸数据集
	int count = 1;                //图片计数 
	CascadeClassifier cascades;   //定义人脸分类器,opencv中的harr Cascades
	cascades.load("haarcascade_frontalface_alt2.xml"); //加载人脸检测器
	VideoCapture cap;
	cap.open(0);                   //打开摄像头,默认的电脑自带摄像头是0
	//cap.open("E://demo.avi");   //或者打开视频 
	std::vector<Rect> faces;       //定义容器存储人脸数据
	//循环10张人脸保存
	while (1)
	{
		cap >> img;                //从视频中读取当前帧        
		cvtColor(img, imgGray, COLOR_BGR2GRAY); //灰度化
		//检测出图片中的人脸,用vector保存各个人脸的坐标、大小(用矩形表示)到faces
		cascades.detectMultiScale(imgGray, faces, 1.1, 5, 0);
		for (size_t i = 0; i < faces.size(); i++) {
			rectangle(img, faces[i], Scalar(0, 255, 0), 1, 8, 0);
		}
		//如果检测到人脸
		if (faces.size() == 1)
		{
			//如果图片小于等于10张
			if (count <= 10)
			{
				Mat faceROI = imgGray(faces[0]);
				//opencv中resize()函数将识别到的人脸图像自动改变尺寸为92x112
				resize(faceROI, myFace, Size(92, 112));
				putText(img, "face_safaearth", faces[0].tl(), FONT_HERSHEY_DUPLEX, 1.2, Scalar(71, 99, 255), 2, LINE_8);
				//保存到可执行文件同目录下的s41文件夹里,这里保存为pgm格式图片,方便后续操作,也可以根据自己需要修改格式
				string filename = format("s41/%d.pgm", count);
				//通过imwrite函数将resize()过后的图片保存到背景数据
				imwrite(filename, myFace);
				imshow(filename, myFace);
				waitKey(100);
				destroyWindow(filename);
				count++;
			}
		}
		imshow("frame", img);
		waitKey(100);

	}
	return 0;
	system("pause");

三:运行结果



可以看到s41文件里已经生成了10张pgm图像,不过因为电脑原因没法查看pgm图像。

下一篇【Opencv综合应用】自制训练集的人脸识别2——制作csv文件

原创文章 4 获赞 7 访问量 343

猜你喜欢

转载自blog.csdn.net/Insincerity/article/details/105838856