前言

上一篇博文与大家分享了简单的图片人脸识别技术,其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道门禁考勤系统、人脸动态跟踪识别系统等等。

案例

这里我们还是使用 opencv 中自带了 haar人脸特征分类器,通过读取一段视频来识别其中的人脸。

代码实现:

#?-*-?coding:?utf-8?-*-__author__?=?"小柒"__blog__?=?"https://blog.52itstyle.vip/"import?cv2import?os#?保存好的视频检测人脸并截图def?CatchPICFromVideo(window_name,?camera_idx,?catch_pic_num,?path_name):
????cv2.namedWindow(window_name)????#?视频来源
????cap?=?cv2.VideoCapture(camera_idx)????#?告诉OpenCV使用人脸识别分类器
????classfier?=?cv2.CascadeClassifier(os.getcwd()+"\\haarcascade\\haarcascade_frontalface_alt.xml")????#?识别出人脸后要画的边框的颜色,RGB格式,?color是一个不可增删的数组
????color?=?(0,?255,?0)

????num?=?0
????while?cap.isOpened():
????????ok,?frame?=?cap.read()??#?读取一帧数据
????????if?not?ok:????????????break

????????grey?=?cv2.cvtColor(frame,?cv2.COLOR_BGR2GRAY)??#?将当前桢图像转换成灰度图像

????????#?人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
????????faceRects?=?classfier.detectMultiScale(grey,?scaleFactor=1.2,?minNeighbors=3,?minSize=(32,?32))????????if?len(faceRects)?>?0:??#?大于0则检测到人脸
????????????for?faceRect?in?faceRects:??#?单独框出每一张人脸
????????????????x,?y,?w,?h?=?faceRect????????????????#?将当前帧保存为图片
????????????????img_name?=?"%s/%d.jpg"?%?(path_name,?num)????????????????#?print(img_name)
????????????????image?=?frame[y?-?10:?y?+?h?+?10,?x?-?10:?x?+?w?+?10]
????????????????cv2.imwrite(img_name,?image,?[int(cv2.IMWRITE_PNG_COMPRESSION),?9])

????????????????num?+=?1
????????????????if?num?>?(catch_pic_num):??#?如果超过指定最大保存数量退出循环
????????????????????break

????????????????#?画出矩形框
????????????????cv2.rectangle(frame,?(x?-?10,?y?-?10),?(x?+?w?+?10,?y?+?h?+?10),?color,?2)????????????????#?显示当前捕捉到了多少人脸图片了,这样站在那里被拍摄时心里有个数,不用两眼一抹黑傻等着
????????????????font?=?cv2.FONT_HERSHEY_SIMPLEX
????????????????cv2.putText(frame,?'num:%d/100'?%?(num),?(x?+?30,?y?+?30),?font,?1,?(255,?0,?255),?4)????????????????#?超过指定最大保存数量结束程序
????????if?num?>?(catch_pic_num):?break

????????#?显示图像
????????cv2.imshow(window_name,?frame)
????????c?=?cv2.waitKey(10)????????if?c?&?0xFF?==?ord('q'):????????????break

????????????#?释放摄像头并销毁所有窗口
????cap.release()
????cv2.destroyAllWindows()if?__name__?==?'__main__':????#?连续截100张图像
????CatchPICFromVideo("get?face",?os.getcwd()+"\\video\\kelake.mp4",?100,?"E:\\VideoCapture")

动图有点花,讲究着看吧:

如果是捕捉摄像头,只需要改变以下代码即可:

#?如果获取摄像头,参数修改为?0?即可cap?=?cv2.VideoCapture(0)

源码

https://gitee.com/52itstyle/Python/tree/master/Day09