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,