• 图像处理项目——制作自己的人脸数据集


    制作自己的人脸数据集

    *开发环境为visual studio2010
    *使用的是opencv中的Haart特征分类器,harr Cascades
    *检测对象为人脸照片 
    一:主要步骤

    1、加载人脸检测器
    2、打开电脑摄像头,载入视频流,抽取帧,进行灰度化处理
    3、识别人脸,采集20张保存到文件中

    二 :代码

     1 /****************************************************
     2 制作自己的人脸数据集:
     3 1、加载人脸检测器
     4 2、打开电脑摄像头,载入视频流,抽取帧,进行灰度化处理
     5 3、识别人脸,采集20张保存到文件中
     6 *****************************************************/
     7 #include "opencv2/objdetect.hpp"
     8 #include "opencv2/videoio.hpp"
     9 #include "opencv2/highgui.hpp"
    10 #include "opencv2/imgproc.hpp"
    11 #include <iostream>
    12 #include <stdio.h>
    13 #include <string.h>
    14 #include <stdlib.h>
    15 using namespace std;
    16 using namespace cv;
    17 
    18 int main()
    19 { 
    20    Mat img;                      //用于存储每一帧的图像
    21    Mat imgGray;                  //用于存储灰度图
    22    Mat myFace;                   //用于存储我的人脸数据集
    23    int count=1;                //图片计数 
    24    CascadeClassifier cascades;   //定义人脸分类器,opencv中的harr Cascades
    25    cascades.load("models/lbpcascade_frontalface.xml"); //加载人脸检测器
    26    VideoCapture cap;
    27    cap.open(0);                   //打开摄像头
    28    //cap.open("E://demo.avi");   //打开视频 
    29    std::vector<Rect> faces;       //定义容器存储人脸数据
    30    //循环20张人脸保存
    31   while(1)
    32    {
    33      cap >> img;                   //从视频中读取当前帧        
    34      cvtColor(img,imgGray,COLOR_BGR2GRAY); //灰度化
    35      //检测出图片中的人脸,用vector保存各个人脸的坐标、大小(用矩形表示)到faces
    36      cascades.detectMultiScale(imgGray,faces, 1.1, 5,0);
    37      for(size_t i = 0; i < faces.size(); i++){
    38         rectangle(img, faces[i], Scalar(0, 255, 0), 3, 8, 0);
    39      }
    40      //如果检测到人脸
    41     if(faces.size() == 1) 
    42      {     
    43          //如果图片小于等于20张
    44         if(count<=20)
    45          {
    46              Mat faceROI = imgGray(faces[0]);    
    47              resize(faceROI, myFace,Size(92,112));//opencv中resize()函数将识别到的人脸图像自动改变尺寸为92x112
    48                 putText(img, "face_zsc", faces[0].tl(), FONT_HERSHEY_DUPLEX, 1.2, Scalar(71, 99, 255), 2, LINE_8);
    49              string filename = format("faces/myface/%d.jpg", count);      //保存到此文件
    50              imwrite(filename, myFace);      //通过imwrite函数将resize()过后的图片保存到背景数据
    51              imshow(filename,myFace);   
    52              waitKey(100);
    53              destroyWindow(filename);             
    54              count++;
    55          } 
    56      }
    57     imshow("frame",img);
    58     waitKey(100);   
    59     
    60    }
    61    return 0;
    62    system("pause");
    63 }

    三 : 制作结果

    萍水相逢逢萍水,浮萍之水水浮萍!
  • 相关阅读:
    TCP 传递信息
    如何在数据源是空的时候,gridview显示表头(万能)
    (orm1)O/R Mapping在实际中用于什么方面最有优势?[转]
    web service 数据传输有什么限制? 为什么?DataTable可以作为web service参数传递么?90
    C#对象的 Xml序列化与反序列化
    题目:当点击按钮时,如何实现两个td的值互换?【js】
    4.如何获取动态生成的SL控件的NAME值(二)
    gridview排序加箭头(二)
    我们没有在一起
    (orm 2) LINQ与ORM
  • 原文地址:https://www.cnblogs.com/AIBigTruth/p/10533485.html
Copyright © 2020-2023  润新知