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