OpenCV训练模型
目录:
- 1.工具准备
- 安装OpenCV3,并添加环境变量
- 安装qt,并将OpenCV3中src,face,hace.hpp文件拷贝到工程文件下
- 2.训练部分
- 采集人脸(十张黑白照)
- 训练模型
- 人脸识别
工具准备
-
1.Opencv的安装
将用mingw源码编译好的opencv库的路径加入到电脑中类似于linux的path:
-
2.在qt中添加opencv
在qt文件中的.pro添加路径 具体参考自己的opencv路径
训练部分
- 采集人脸
(1)在qt项目中要将OpenCV人脸识别所需要的相关文件导入
整个项目架构
face文件中包含的头文件
src文件包含的头文件
src文件中包含的C文件
(2)代码
haarcascade_frontalface_alt2.xml是官方提供的人脸检测分类器
#include <iostream>
#include <opencv2\opencv.hpp>
#include <vector>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
CascadeClassifier cascada;
//将opencv官方训练好的人脸识别分类器拷贝到自己的工程目录
cascada.load("D:\\Qt_Project\\video\\pic\\haarcascade_frontalface_alt2.xml");
//0表示电脑自带,1表示外接摄像头
VideoCapture cap(0);
Mat frame, myFace;
int pic_num = 1;
while(1)
{
//摄像头读图像
cap >> frame;
//vector容器村检测到的faces
vector<Rect> faces;
Mat frame_gray;
//转灰度化,减少运算
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
cascada.detectMultiScale(frame_gray, faces, 1.1, 4, CV_HAAR_DO_ROUGH_SEARCH, Size(70,70), Size(1000,1000));
printf("检测到人脸个数:%d\n", faces.size());
//识别到的脸用矩形圈出
for (int i = 0; i < faces.size(); i++)
{
rectangle(frame, faces[i], Scalar(255, 0, 0), 2, 8, 0);
}
//当只有一个人脸的时候,开始拍照
if(faces.size() == 1)
{
Mat faceROI = frame_gray(faces[0]);
//cout << faces[0].x << endl; // 测试face[0].x
//将兴趣域size为92*102
resize(faceROI, myFace, Size(92,112));
//在 faces[0].tl()的左上角上面写序号
putText(frame, to_string(pic_num), faces[0].tl(), 3, 1.2, (0, 0, 225), 2, 0);
//图片存储位置
string filename = format("D:\\Qt_Project\\video\\%d.jpg", pic_num);
//存在当前目录
imwrite(filename, myFace);
//显示下size后的脸
imshow(filename, myFace);
//等待500us
waitKey(500);
//销毁指定窗口
destroyWindow(filename);
//序列加一
pic_num++;
if(pic_num == 11)
{
return 0;//拍十组照片结束
}
}
int c =waitKey(10);
//10us内输入ese退出循环
if((char)c == 27) {break;}
imshow("frame", frame);
//等待100us
waitKey(100);
}
return 0;
}
每一天的分享时刻