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;
}
posted @ 2023-08-15 18:32  Kεvin  阅读(209)  评论(0编辑  收藏  举报