一、使用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()
效果不错,就不展示图了(不想展示脸。。。。)