人脸检测(三)

3.OpenCV人脸检测方法
采用的是harr-like特征提取 + adaboost级联分类器构成的人脸检测算法,可以设置要检测的人脸大小范围,召回率高,但有时会出现误检;当设置要检测的人脸比较大时,检测速度很快,可以达到实时检测;检测到的人脸框位置不够精细。

这里写图片描述

参考opencv安装目录下source\samples\cpp文件夹tutorial_code\objectDetection中的示例程序,官网 中有人脸检测相关的函数说明。
下面给出利用opencv3进行人脸检测的python和C++代码,可以进行单张图像、摄像头中或视频中的人脸检测。
python版本:

# -*- coding: utf-8 -*-
"""
Created on Sun May 07 18:49:11 2017

@author: Administrator
"""
import cv2
import time

def face_detection(ccf,im):
    if im.shape[2] == 3:
        gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #级联分类器只能检测灰度图像
    else:
        gray = im
    faces = ccf.detectMultiScale(gray,1.1,3,0,(64,64),(256,256)) #多尺度人脸检测,设置检测的人脸大小范围
    for face in faces: #face:(x,y,width,height)
        cv2.rectangle(im,(face[0],face[1]),(face[0]+face[2],face[1]+face[3]),(0,0,255),2,8)
    return im

def read_capture(ccf):
#    video = cv2.VideoCapture('xxx.mp4') #从视频中读取
    video = cv2.VideoCapture(0) #从摄像头读取
    if video.isOpened():
        success,frame = video.read()
        while success:
            im = face_detection(ccf,frame)
            cv2.imshow('capture face detection',im)
            if cv2.waitKey(1) >= 0 :
                break
            success,frame = video.read()
        cv2.destroyAllWindows()
        video.release()

if __name__ == '__main__' :
    ccf = cv2.CascadeClassifier('D:/OPENCV3.0.0/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml') #加载级联人脸检测器
    start_time = time.time()                           
    #从单张图像中检测人脸
    im = cv2.imread('C:/Users/Administrator/Desktop/caffe/matlab/demo/1.jpg')
    output = face_detection(ccf,im)

    end_time = time.time()
    print (end_time-start_time)*1000,'ms'
    cv2.imshow('face detection',output)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#    read_capture(ccf) #视频或摄像头中人脸检测

C++版本:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <time.h>
using namespace cv;
using namespace std;

Mat faceDetection(CascadeClassifier ccf, Mat img_src);
void readCapture(CascadeClassifier ccf);
void readVideo(CascadeClassifier ccf);

void main()
{
    //string xmlPath = "D:\\OPENCV3.0.0\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml"; //训练好的分类xml文件
    string xmlPath = "D:\\OPENCV3.0.0\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"; //训练好的分类xml文件(改进版)
    CascadeClassifier ccf; //级联分类器,很重要的类
    if (!ccf.load(xmlPath))
    {
        cout << "can not open this xml file" << endl;
        system("pause");
        return;
    }

    //readCapture(ccf); //摄像头中人脸检测
    //readVideo(ccf); //视频中人脸检测
    //单张图片人脸检测
    Mat img_src = imread("1.jpg");
    Mat img_dst = faceDetection(ccf, img_src); 
    imshow("face detection", img_dst);
    waitKey(0);
}

//opencv人脸检测,原理是提取harr或lbp特征,送入adaboost级联分类器
//输入待检测图像,返回画框/圆图像
Mat faceDetection(CascadeClassifier ccf, Mat img_src)
{
    clock_t start, end; //用于计时,毫秒级
    start = clock();

    Mat img_dst = img_src.clone(); //将输入图像拷贝为输出结果图像

    Mat gray;
    cvtColor(img_src, gray, COLOR_BGR2GRAY); //在opencv3命名规范中,CV_BGR2GRAY变成了COLOR_BGR2GRAY
    equalizeHist(gray, gray);

    /*
    void CascadeClassifier::detectMultiScale(InputArray image, vector<Rect>& objects, double scaleFactor=1.1,
    int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
    第一个参数image:  要检测的图片,一般为灰度图
    第二个参数objects:  Rect型的容器,存放所有检测出的人脸,每个人脸是一个矩形
    第三个参数scaleFactor:  缩放因子,对图片进行缩放,默认为1.1
    第四个参数minNeighbors: 最小邻居数,默认为3
    第五个参数flags:  兼容老版本的一个参数,在3.0版本中没用处。默认为0
    第六个参数minSize: 最小尺寸,检测出的人脸最小尺寸
    第七个参数maxSize: 最大尺寸,检测出的人脸最大尺寸
    */
    vector<Rect> faces; //定义人脸框
    ccf.detectMultiScale(gray, faces, 
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值