OpenCV之使用Haar Cascade进行脸部特征检测

Haar Cascade常用来做人脸检测,其实它可以检测任何对象。OpenCV项目源码中有很多训练好的Haar分类器。如果你要检测什么物体,先Google,也许已经有训练好的Haar分类器了(像汽车、猫,狗之类的)。

使用OpenCV自带的Haar分类器检测脸和眼睛,代码:

import cv2
import sys
 
img = cv2.imread(sys.argv[1])
 
# 加载分类器
# 路径改为自己的opencv的文件路径
face_haar = cv2.CascadeClassifier("data/haarcascades/haarcascade_frontalface_default.xml")
eye_haar = cv2.CascadeClassifier("data/haarcascades/haarcascade_eye.xml")
# 把图像转为黑白图像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测图像中的所有脸
faces = face_haar.detectMultiScale(gray_img, 1.3, 5)
for face_x,face_y,face_w,face_h in faces:
	cv2.rectangle(img, (face_x, face_y), (face_x+face_w, face_y+face_h), (0,255,0), 2)
        # 眼长在脸上
	roi_gray_img = gray_img[face_y:face_y+face_h, face_x:face_x+face_w]
	roi_img = img[face_y:face_y+face_h, face_x:face_x+face_w]
	eyes = eye_haar.detectMultiScale(roi_gray_img, 1.3, 5)
	for eye_x,eye_y,eye_w,eye_h in eyes:
		cv2.rectangle(roi_img, (eye_x,eye_y), (eye_x+eye_w, eye_y+eye_h), (255,0,0), 2)
 
cv2.imshow('img', img)
cv2.waitKey(0)
 
cv2.destroyAllWindows()

使用摄像头做为输入,实时检测:

import cv2
 
face_haar = cv2.CascadeClassifier("data/haarcascades/haarcascade_frontalface_default.xml")
eye_haar = cv2.CascadeClassifier("data/haarcascades/haarcascade_eye.xml")
 
cam = cv2.VideoCapture(0)
 
while True:
	_, img = cam.read()
	gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
	faces = face_haar.detectMultiScale(gray_img, 1.3, 5)
	for face_x,face_y,face_w,face_h in faces:
		cv2.rectangle(img, (face_x, face_y), (face_x+face_w, face_y+face_h), (0,255,0), 2)
 
		roi_gray_img = gray_img[face_y:face_y+face_h, face_x:face_x+face_w]
		roi_img = img[face_y:face_y+face_h, face_x:face_x+face_w]
		eyes = eye_haar.detectMultiScale(roi_gray_img, 1.3, 5)
		for eye_x,eye_y,eye_w,eye_h in eyes:
			cv2.rectangle(roi_img, (eye_x,eye_y), (eye_x+eye_w, eye_y+eye_h), (255,0,0), 2)
 
	cv2.imshow('img', img)
	key = cv2.waitKey(30) & 0xff
	if key == 27:
		break
 
cam.release()
cv2.destroyAllWindows()

上面我们使用的是训练好的分类器文件,如果你要检测的物体没有现成的Haar分类器,我们只能自己训练了,其中最费事的部分就是制作训练样本。

训练自己的Haar分类器可以参考http://blog.topspeedsnail.com/archives/10511