人脸和性别识别(基于OpenCV)

本文介绍了基于OpenCV的人脸检测和识别过程,包括人脸检测的四个步骤,如加载Harr人脸检测XML文件,图像预处理,检测人脸。接着讨论了人脸识别,包括收集和学习人脸,以及使用支持向量机、人工神经网络或特征脸算法进行训练。最后提到了测试程序的环节。
摘要由CSDN通过智能技术生成

描述

人脸识别包括四个步骤

  1. 人脸检测:定位人脸区域,只关心是不是脸;
  2. 人脸预处理:对人脸检测出来的图片进行调整优化;
  3. 收集和学习人脸:收集要识别的人的预处理过的人脸,然后通过一些算法去学习如何识别;
  4. 人脸识别:识别当前人脸与数据库里的哪个人脸最相似。

人脸检测

OpenCV集成了基于PCA LDA 和LBP的人脸检测器,源文件自带很多各种训练好的检测器。下表是常用的XML文件
这里写图片描述
上面的XML文件可以检测正面人脸、眼睛或鼻子。检测人脸我采用的是第一个或第二个Harr人脸检测器。识别率比较好。

第一步:加载Harr人脸检测XML文件

try{
        faceCascade.load(faceCascadeFilename);
    }catch(cv::Exception& e){}

        if ( faceCascade.empty() ) {
        cerr << "ERROR: Could not load Face Detection cascade classifier [" << faceCascadeFilename << "]!" << endl;
        cerr << "Copy the file from your OpenCV data folder (eg: 'C:\\OpenCV\\data\\haarcascade_frontalface_alt2') into this WebcamFaceRec folder." << endl;
        exit(1);
    }
    cout << "Loaded the Face Detection cascade classifier [" << faceCascadeFilename << "]." << endl;

第二步:加载摄像头,从视频获取图像帧。

try{
        videoCapture.open(CameraID);
    }catch(cv::Exception& e){}

    if(!videoCapture.isOpened()){
        cerr << "ERROR: could not open Camera!" << endl;
        exit(1);
    }

videoCapture >> cameraFrame;

第三步:一帧图像预处理

1、 灰度转换:使用cvtColor()函数,将彩色图像转换为灰度图像。台式机是3通道的BGR,移动设备则是4通道的BGRA格式

if(srcimg.channels() ==3 ){
         cvtColor(srcimg,gray_img,CV_BGR2GRAY);
     }
    else if(srcimg.channels() ==4 ){
         cvtColor(srcimg,gray_img,CV_BGRA2GRAY);
     }
    else {
         gray_img = srcimg;
     }

2、直方图均衡化,在OpenCV函数中利用equalizeHist()函数执行直方图均衡化,提升对比度和亮度。

equalizeHist(gray_img,equalized_Img);

第四步:检测人脸

上面已经创建了级联分类器并加载好XML文件,接着使用函数Classifier::detecMultiScale()函数来检测人脸。这个函数的参数说明:
a、minFeatureSize: 该参数决定最小的人脸大小,通常可以设为20*20或30*30像素。如果使用摄像机或移动设备检测,则人脸一般很接近摄像机,可把参数调大,80*80;
b、searchScaleFactor: 该参数决定有多少不同大小的人脸要搜索,通常设为1.1
c、minNeighbors: 该参数决定检测器如何确定人脸已经被检测到。通常设为3
d、flags: 该参数设定是否要查找所有的人脸或最大的人脸
(CASCADE_FIND_BIGGEST_OBJECT)

int flags = CASCADE_FIND_BIGGEST_OBJECT;
    //smallest object Size
    Size minFeatureSize = Size(20,20);
    // How detailed should the search be. Must be larger than 1.0.
    float searchScaleFactor = 1.1f;
    // How much the detections should be filtered out. This should depend on how bad false detections are to your system.
    // minNeighbors=2 means lots of good+bad detections, and minNeighbors=6 means only good detections are given but some are missed.
    int minNeighbors = 6;
    vector<Rect> faces;
    faceCascade.detectMultiScale(dectImg,faces,searchScaleFactor,
                                    minNeighbors,flags,minFeatureSize);
    //faceCascade.detectMultiScale(equalized_Img, faces);
    int i = 0;
    for(i = 0; i < faces.size(); i++){
        Rect face_id = faces[i];
        rectangle(orginalimg,face_id,Scalar(0,255,0),1);
    }

人脸识别

为了识别人脸,需要收集足够多的要识别的人的人脸图像。收集好之后,选择适合人脸识别的机器学习算法,通过算法来学习收集的数据,从而训练出一个模型并保存,下次进来一帧图像,通过算法对模型里的参数进行匹配识别。人脸识别机器学习算法有很多,如SVM(支持向量机),ANN(人工神经网络)还有最常用的是基于特征脸的算法。OpenCV提供了CV::Algorithm类,类中有基于特征脸的(PCA 主成分分析)、Fisher脸(LDA 线性判别分析)和LPBH(局部二值模式直方图)

使用里面的算法,第一步必须通过cv::Algorithm::creat< FaceRecognizer>创建一个FaceRecognizer对象。创建了FaceRecognizer对象之后,将收集的人脸数据和标签传递给FaceRecognizer::train() 函数即可进行训练模型。

string facerecAlgorithm = "FaceRecognizer.Fisherfaces";
Ptr<FaceRecognizer> model;
// Use OpenCV's new FaceRecognizer in the "contrib" module:
model = Algorithm::create<FaceRecognizer>(facerecAlgorithm);
if (model.empty()) {
cerr << "ERROR: The FaceRecognizer [" << facerecAlgorithm;
 cerr << "] is not available in your version of OpenCV. ";
 cerr << "Please update to OpenCV v2.4.1 or newer." << endl;
 exit(1);
}

model->train(preprocessedFaces, faceLabels);

训练好模型之后,一般是把模型保存下来,以免下次重复训练。直接加载模型即可。下一步就是人脸识别。同样,opencv把识别算法集成在FaceRecognizer类中,简单地调用FaceRecognizer::predict() 就可以识别。

int identity = model->predict(preprocessedFace);

测试程序

/*
 * Copyright (c) 2011. Philipp Wagner <bytefish[at]gmx[dot]de>.
 * Released to public domain under terms of the BSD Simplified license.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   * Redistributions of sourc
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值