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

一、人脸检测并采集个人图像

//take_photo.cpp
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;

void take_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();//关闭所有窗口
}

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

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

//face_recognition.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp>

using namespace cv;
using namespace cv::face;
using namespace std;

double face_recognition() {
    //读取文件,转换为数据流
    string filename = string("at.txt");
    ifstream file(filename.c_str(), ifstream::in);
    if (!file)
        cout << "error" << endl;

    string line, 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 namespace cv;
using namespace cv::face;
using namespace std;

void take_photo();
double face_recognition();

void main() {
    int flag;
    double rate;
    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");

}

原文地址:https://www.cnblogs.com/little-monkey/p/8126619.html

时间: 2024-10-14 06:03:07

opencv学习之路(41)、人脸识别的相关文章

openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)

原理:使用GT人脸库做样本,VS2010下使用openCV2.44自带的Haar算法检測人脸区域,ASM Library特征检測,然后使用YCrCb颜色空间做肤色检測,再用LBP+Gabor小波提取特征,最小邻近距离做分类识别. 1.GT人脸库 Georgia Tech face database,网址:http://www.anefian.com/research/face_reco.htm GT人脸库包括50个人,每人15张不同角度.不同表情的正面照片. 图片为JPG格式,640*480,大

用opencv做的静态图片人脸识别

这次给大家分享一个图像识别方面的小项目,主要功能是识别图像中的人脸并根据人脸在图片库找出同一个与它最相似的图片,也就是辨别不同的人. 环境:VS2013+opencv2.4.13 主要是算法:opencv中人脸识别算法(截取人脸)+哈希算法(辨别人脸) opencv中人脸识别算法:这个很常用,就是普通的人脸识别算法,直接上代码: void IdentifyFace(Mat image) //识别并截取人脸 { CascadeClassifier ccf; ccf.load(xmlPath); v

利用openCV实现自动抓拍,人脸识别,清晰度的验证等

1.本文主要涉及到opencv的视频帧抓拍和验证的相关问题,不包含如何集成opencv 2.主要讲解涉及到opencv中的关键类及一些常用的方法 3.着重讲解代理方法: - (void)processImage:(cv::Mat &)image 4.集成过程中的注意事项 5.附上抓拍的小demo的下载地址 6.扩展,验证抓拍的图片中是否包含人脸 =====================================分割线====================================

Python scikit-learn 学习笔记—PCA+SVM人脸识别

人脸识别是一项实用的技术.但是这种技术总是感觉非常神秘,在sklearn中看到了人脸识别的example,代码网址如下: http://scikit-learn.org/0.13/auto_examples/applications/face_recognition.html#example-applications-face-recognition-py 首先介绍一些PCA和SVM的功能,PCA叫做主元分析,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题.计算主成分的目的

OpenCV学习之路——车牌识别之车牌定位

去年七月份因为学校项目需要开始接触图像处理,但那时候只是到网上找车牌识别代码,然后加入到自己的项目中,不清楚细节原理. 现在自己重新一步步实现车牌识别. 高斯模糊: 1 Mat Gaussian(Mat &img) { 2 Mat out; 3 GaussianBlur(img, out, Size(3, 3), 4 0, 0, BORDER_DEFAULT); 5 return out; 6 7 } 灰度化: 1 Mat Grayscale(Mat &img) { 2 Mat out;

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资料都可以查到,简单来说,就是将图像分成一个cell,通过对每个cell的像素进行梯度处理,进而根据梯度方向和梯度幅度来得到cell的图像特征.随后,将每个cell的图像特征连接起来,得到一个BLock的特征,进而得到一张图片的特征.Opencv当中自带HOG算法,可以直接调用,进行图像的特征提取.但

opencv学习之路(21)、模板匹配及应用

一.模板匹配概念 二.单模板匹配 1 #include "opencv2/opencv.hpp" 2 #include <iostream> 3 using namespace std; 4 using namespace cv; 5 6 void main() 7 { 8 Mat temp=imread("E://mu.jpg"); 9 Mat src=imread("E://lena.jpg"); 10 Mat dst=src.c

opencv学习之路(20)、直方图应用

一.直方图均衡化--equalizeHist() 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 4 void main() 5 { 6 Mat srcImg = imread("E://02.jpg", 0); //以灰度方式打开,需要输入单通道图像 7 imshow("src", srcImg); 8 Mat dstImg; //均衡化后的图像 9 equalizeHist(sr

opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形

一.简介 二.轮廓最小外接矩形的绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 4 void main() 5 { 6 //轮廓最小外接矩形的绘制 7 Mat srcImg = imread("E://00.png"); 8 Mat dstImg = srcImg.clone(); 9 cvtColor(srcImg, srcImg, CV_BGR2GRAY); 10 threshold(srcI