人脸检测(三)
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 timedef face_detection(ccf,im):if im.shape[2] == 3:gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #级联分类器只能检测灰度图像else:gray = imfaces = 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 imdef 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 :breaksuccess,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
#include
#include
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_BGR2GRAYequalizeHist(gray, gray);/*void CascadeClassifier::detectMultiScale(InputArray image, vector& 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 faces; //定义人脸框ccf.detectMultiScale(gray, faces, 1
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
