转自:https://www.cnblogs.com/neo-T/p/6430583.html
OpenCV已经帮我们做了,我们只需调用对应的API函数即可,先给出代码:
1 # -*- coding: utf-8 -*- 2 3 ##关键字无法关闭 摄像头,可能是代码缩进问题。显示图像 在for 里面是无法推出的 4 import sys 5 from PIL import Image 6 import cv2 7 8 def AICatchVideo(v_name, camera_index): 9 # 打开摄像头 ,视频来源,也可以使用已存的视频 10 cap = cv2.VideoCapture(0) 11 # 创建窗口 12 cv2.namedWindow(v_name) 13 # 加载人脸数据(人脸特征),#告诉OpenCV使用人脸识别分类器 14 face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml') 15 while True: 16 ret, frame = cap.read() 17 if not ret: 18 # 等待用户操作 19 cv2.waitKey(30) 20 # 得到每一帧-》图像计算 21 # 灰度转换:转换成灰度的图计算强度得以减低 22 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 23 # 对比 摄像头采集到的数据-》人脸特征训练集 24 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5,minSize=(32,32)) 25 if len(faces)>0: 26 27 for (x, y, w, h) in faces: 28 # 在窗口中识别人脸,画一个矩形 29 frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) 30 #显示图像 31 cv2.imshow(v_name, frame) 32 key = cv2.waitKey(20) 33 if key & 0xFF == ord('q'): 34 break 35 36 # 窗口释放:缓存-》内存条 37 cap.release() 38 cv2.destroyAllWindows() 39 40 41 if __name__ == '__main__': 42 # print(len(sys.argv)) 43 # print('内容是'+ sys.argv[0]) 44 # if len(sys.argv) != 2: 45 # print('Usage:%s camera_id:{}'.format(sys.argv[0])) 46 # else: 47 AICatchVideo('识别人脸区域', sys.argv[0])
#告诉OpenCV使用人脸识别分类器 classfier = cv2.CascadeClassifier("./haarcascade_frontalface_alt2.xml")
这行代码指定OpenCV选择使用哪种分类器(注意,一定习惯分类这个说法,ML的监督学习研究的就是各种分类问题),OpenCV提供了多种分类器:
对同一个画面有可能出现多张人脸,因此,我们需要用一个for循环将所有检测到的人脸都读取出来,然后逐个用矩形框框出来,这就是接下来的for语句的作用。Opencv会给出每张人脸在图像中的起始坐标(左上角,x、y)以及长、宽(h、w),我们据此就可以截取出人脸。其中,cv2.rectangle()完成画框的工作,在这里我有意识的外扩了10个像素以框出比人脸稍大一点的区域。cv2.rectangle()函数的最后两个参数一个用于指定矩形边框的颜色,一个用于指定矩形边框线条的粗细程度。