一、使用OpenCV训练好的级联分类器来识别图像中的人脸
当然还有很多其他的分类器,例如表情识别,鼻子等,具体可在这里下载:
import cv2
# 矩形颜色和描边
color = (0,0,255) # 红色框
strokeWeight = 1 # 线宽为 1
windowName = "Object Detection"
img = cv2.imread("lena.jpg") # 加载检测文件
cascade = cv2.CascadeClassifier("F:/opencv-master/data/haarcascades/haarcascade_frontalface_alt.xml") rects = cascade.detectMultiScale(img) # 获取矩形列表
for x,y, width,height in rects:
cv2.rectangle(img, (x,y), (x+width, y+height), color, strokeWeight) # 显示
cv2.imshow(windowName, img)
cv2.waitKey(0)
效果如图所示:
二、检测摄像头视频中的人脸
原理和在图片中检测出人脸差不多,都是加载训练好的分类器。
import cv2
import time
import numpy as np
print('Press Esc to exit') # 加载分类器
faceCascade = cv2.CascadeClassifier('F:/opencv-master/data/haarcascades/haarcascade_frontalface_default.xml')
imgWindow = cv2.namedWindow('FaceDetect', cv2.WINDOW_NORMAL)
def detect_face():
capInput = cv2.VideoCapture(0)
# 避免处理时间过长造成画面卡顿
nextCaptureTime = time.time()
faces = [] # 检测摄像头是否读取数据
if not capInput.isOpened():
print('Capture failed because of camera')
while 1:
ret, img = capInput.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
if nextCaptureTime < time.time():
nextCaptureTime = time.time() + 0.1 # 使用模板匹配图形
faces = faceCascade.detectMultiScale(gray, 1.3, 5)
if np.all(faces != None):
for x, y, w, h in faces:
# 用蓝色框框出
# 函数的参数分别为:图像,左上角坐标、右下角坐标、颜色、宽度
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.imshow('FaceDetect', img)
# 这是简单的读取键盘输入,27即Esc的acsii码
if cv2.waitKey(1) & 0xFF == 27: break
capInput.release()
cv2.destroyAllWindows() detect_face()
效果不错,就不展示图了(不想展示脸。。。。)