opencv学习之路(41)、人脸识别

摘要:
=255||count/10>20)break;count++;}cap.release();destroyAllWindows();//关闭所有窗口}运行程序,打开摄像头后会自动保存人脸图像,头不要晃动,表情变化即可,对于不合适的照片还需进行筛选。
一、人脸检测并采集个人图像

opencv学习之路(41)、人脸识别第1张

//take_photo.cpp
#include<opencv2/opencv.hpp>
using namespacecv;
using namespacestd;
voidtake_photo() {
    VideoCapture cap(0); //打开摄像头
    if (!cap.isOpened())
        return;
    //加载级联检测器
CascadeClassifier cascade;
    cascade.load("F:/opencv3.2/Release_x64/etc/haarcascades/haarcascade_frontalface_alt_tree.xml");
    Mat frame;
    vector<Rect>faces;
    int count = 0;
    while (cap.read(frame))        //相当于cap >> frame
{
        cascade.detectMultiScale(frame, faces, 1.1, 1, 0, Size(100, 100), Size(400, 400));//检测是否有人脸
        for (int i = 0; i < faces.size(); i++)
        {
            if (count % 10 == 0) {    //每10帧保存一次人脸图像
Mat dst;
                resize(frame(faces[i]), dst, Size(92, 112));//设置人脸图像大小
                cvtColor(dst, dst, COLOR_BGR2GRAY);//转为灰度图节省计算
                imwrite(format("att_faces/s41/pic%d.jpg", count / 10), dst);
            }
            rectangle(frame, faces[i], Scalar(0, 255, 0));
        }
        imshow("video", frame);
        //按下任意键退出摄像头(waitkey在本系统环境下默认为255),或者是保存了20张人脸图片后,退出
        if (waitKey(50) != 255 || count / 10>20)
            break;
        count++;
    }
    cap.release();
    destroyAllWindows();//关闭所有窗口
}

运行程序,打开摄像头后会自动保存人脸图像,头不要晃动,表情变化即可,对于不合适的照片还需进行筛选。

opencv学习之路(41)、人脸识别第2张

二、基于特征脸算法的人脸识别

opencv学习之路(41)、人脸识别第3张

opencv学习之路(41)、人脸识别第4张

//face_recognition.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp>
using namespacecv;
using namespacecv::face;
using namespacestd;
doubleface_recognition() {
    //读取文件,转换为数据流
    string filename = string("at.txt");
    ifstream file(filename.c_str(), ifstream::in);
    if (!file)
        cout << "error" <<endl;
    stringline, path, classlabel;
    vector<Mat>image;
    vector<int>labels;
    char separator = ';';
    while(getline(file, line))
    {
        stringstream liness(line);
        getline(liness, path, separator);
        getline(liness, classlabel);
        if (!path.empty() && !classlabel.empty())
        {
            //cout << "path:" << path<< endl;
            image.push_back(imread(path, 0));
            labels.push_back(atoi(classlabel.c_str()));
        }
    }
    if (image.size() < 1 || labels.size() < 1)
        cout << "invalid image path..." <<endl;
    //最后一个人为测试样本
    Mat testSample = image[image.size() - 1];
    int testLabel = labels[labels.size() - 1];
    image.pop_back();
    labels.pop_back();
    //EigenFace算法的模型训练
    Ptr<BasicFaceRecognizer>model =createEigenFaceRecognizer();
    model->train(image, labels);
    //对样本进行识别
    int predictLabel = model->predict(testSample);
    cout << "actual label:" << testLabel << ",predict label:" << predictLabel <<endl;
    //加载级联检测器
CascadeClassifier cascade;
    cascade.load("haarcascade_frontalface_alt_tree.xml");//识别时用alt_tree分类器,宁可漏检也不误检
    //打开摄像头
    VideoCapture cap(0);
    if (!cap.isOpened())
        cout << "error...";
    Mat frame;
    vector<Rect>faces;
    int correct = 0, total = 0;
    while (cap.read(frame))        //相当于cap >> frame,读取摄像头的每一帧
{
        cascade.detectMultiScale(frame, faces, 1.1, 1, 0, Size(80, 100), Size(380, 400));//检测是否有人脸
        for (int i = 0; i < faces.size(); i++)
        {
            Mat roi =frame(faces[i]);
            cvtColor(roi, roi, COLOR_BGR2GRAY);
            resize(roi, testSample, testSample.size());
            int label = model->predict(testSample);
            rectangle(frame, faces[i], Scalar(0, 255, 0));
            if (label == 41)
            {
                putText(frame, "ZhangChunFu", faces[i].tl(), FONT_HERSHEY_COMPLEX, 1.0, Scalar(0, 0, 255));
                correct++;
            }
            else
                putText(frame, format("%d", label), faces[i].tl(), CV_FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255));
        }
        total++;
        imshow("人脸识别——MR.Zhang", frame);
        if (waitKey(50) == 27)
            break;
    }
    cap.release();
    destroyAllWindows();//关闭所有窗口
    waitKey(0);
    double rate = (1.0*correct) /total;
    return rate;//返回正确率
}
//main.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp>
#include <iostream>
using namespacecv;
using namespacecv::face;
using namespacestd;
voidtake_photo();
doubleface_recognition();
voidmain() {
    intflag;
    doublerate;
    cout << "欢迎使用人脸识别系统(1代表录入人脸,2代表识别人脸),请输入您的选择:" <<endl;
    cin >>flag;
    cout << "请稍等片刻……"<<endl;
    switch(flag)
    {
    case 1:take_photo();
        return;
    case 2:
        rate=face_recognition();
        break;
    default:
        break;
    }
    cout << "识别率:" << rate <<endl;
    system("pause");
}

opencv学习之路(41)、人脸识别第5张

免责声明:文章转载自《opencv学习之路(41)、人脸识别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Matlab基本函数-floor函数IT也要健康:帮助你保持健康的几个重要因素下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

AI人脸识别的测试重点

最常见的 AI应用就是人脸识别,因此这篇文章从人脸识别的架构和核心上,来讲讲测试的重点。 测试之前需要先了解人脸识别的整个流程,红色标识代表的是对应AI架构中的各个阶段 首先是人脸采集。 安装拍照摄像设备之后,需要在动态的场景与复杂的背景中判断是否存在人脸,并分离出这种面像。然后采集到人脸的照片。   因此采集过程是非常重要的,一需要能够采集到内容,二...

虹软ArcFace人脸识别 与 Dlib 人脸识别对比

我司最近要做和人脸识别相关的产品,原来使用的是某在线人脸识别平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用人脸识别功能。基于这些考虑,我司需要寻找其他的方案。 通过搜索,目前发现,开源或免费支持离线的方案也有不少。目前初步考虑虹软 ArcFace和Dlib。通...

【C#】虹软Arc人脸识别 ArcFace 2.0 demo

环境: win7以上 VS2013以上 sdk版本:ArcFace v2.0 x86 x64平台Debug、Release配置都已通过编译下载地址:https://github.com/ArcsoftEscErd/ArcfaceDemo_CSharp.git 配置过程: 1. 到[虹软官网](https://ai.arcsoft.com.cn/index....

Android打开相机进行人脸识别,使用虹软人脸识别引擎

上一张效果图,渣画质,能看就好 功能说明: 人脸识别使用的是虹软的FreeSDK,包含人脸追踪,人脸检测,人脸识别,年龄、性别检测功能,其中本demo只使用了FT和FR(人脸追踪和人脸识别),封装了开启相机和人脸追踪、识别功能在FaceCameraHelper中。 实现逻辑: 打开相机,监听预览数据回调进行人脸追踪,且为每个检测到的人脸都分配一个tr...

Android 虹软2.0人脸识别,注册失败问题 分析synchronized的作用

人脸识别需要init初始化(FaceServer中),离开时需要unInit销毁;当一个含有人脸识别的界面A跳向另一个含有人脸识别的界面B时,由于初始化和销毁都是对FaceServer类加锁(synchronized (this) {})的,所以导致注册时为注销失败,或注册了又被注销失败。 FaceServer类中: 初始化: public boolean...

opencv 人脸识别 (一)训练样本的处理

本文实现基于eigenface的人脸检测与识别。给定一个图像数据库,进行以下步骤: 进行人脸检测,将检测出的人脸存入数据库2 对数据库2进行人脸建模 在测试集上进行recognition 本篇实现第一步: 进行人脸检测,将检测出的人脸存入数据库2 环境:vs2010+opencv 2.4.6.0 特征:eigenface Input:一个人脸数据库,...