疫情期间学校去不了,在家闲着没事,刚好有学校的比赛项目,就趁着机会做一下,顺便学习学习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图像。