进行人脸检测前需要调用笔记本的摄像头。
opencv中通过cv2.VideoCapture()来进行摄像头的调用。括号中为0代表调用本机摄像头,为1代表调用usb摄像头。
调用摄像头后,就需要进行人脸的检测,此处需要借助opencv中的CascadeClassifier()函数加载haarcascade_frontalface_alt.xml文件。
之后就是对摄像头得到的每帧视频进行处理,要对它进行灰度转换,再用之前加载得分类器进行人脸检测。使用classfier.detectMultiScale()返回检测到得人脸矩阵的Rect(x,y,w,h),x、y是左上角起始坐标,h、w是高和宽。
将得到的矩阵用cv2.rectangle()画出来。
所有代码如下:

import cv2

def openvideo(window_name ,video_id):
    cv2.namedWindow(window_name) # 创建一个窗口

    cap=cv2.VideoCapture(video_id) # 获取摄像头
    while cap.isOpened():
        ok,frame=cap.read() # ok表示摄像头读取状态,frame表示摄像头读取的图像
        if not ok :
            break

        cv2.imshow(window_name,frame) # 将图像矩阵显示在一个窗口中
        c=cv2.waitKey(10) # 等待10ms,10ms内没有按键操作就进入下一次while循环,从而得到10ms一帧的效果,waitKey返回在键盘上按的键
        if c & 0xFF==ord('q'): # 按键q后break
            break

    # 释放资源
    cap.release()
    cv2.destroyWindow(window_name)
    print("cam closed")


def facedetect(windowname,camera_id):

    cv2.namedWindow(windowname)

    cap=cv2.VideoCapture(camera_id,cv2.CAP_DSHOW)
    # Face Detection using Haar Cascades http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html?highlight=cascadeclassifier
    classfier=cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') # 加载分类器,分类器位置可以自行更改,注意这里用opencv库文件夹下的绝对路径也不行,在库文件夹里找到这个文件复制到这个程序的同目录下,

    color=(0,225,0)#人脸框的颜色,采用rgb模型,这里表示g取255,为绿色框

    while cap.isOpened():
        ok,frame=cap.read() # 读取一帧数据,ok表示摄像头读取状态,frame表示摄像头读取的图像矩阵mat类型
        print(ok)
        if not ok:
            break
        # 灰度
        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#图像灰度化,cv2.cvtColor(input_image, flag) where flag determines the type of conversion.
        # detectMultiScale完成人脸探测工作,returns the positions of detected faces as Rect(x,y,w,h),x、y是左上角起始坐标,h、w是高和宽
        # grey是要识别的图像数据,scaleFactor图像缩放比例,可以理解为同一个物体与相机距离不同,其大小亦不同,必须将其缩放到一定大小才方便识别,该参数指定每次缩放的比例
        faceRects=classfier.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32,32)) # 利用分类器检测灰度图像中的人脸矩阵数,1.2和3分别为图片缩放比例和需要检测的有效点数

        print(faceRects)
        if len(faceRects)>0:#大于0则检测到人脸

            for faceRect in faceRects:# 可能检测到多个人脸,用for循环单独框出每一张人脸
                x,y,w,h=faceRect#获取框的左上的坐标,框的长宽
                cv2.rectangle(frame,(x-10,y-10),(x+w-10,y+h-10),color,2)

        cv2.imshow(windowname,frame) # 显示图像
        c=cv2.waitKey(10)
        if c&0xFF==27: # 退出条件
            break

    cap.release()#释放摄像头并销毁所有窗口
    cv2.destroyAllWindows()

print ('open camera...')
# openvideo('mycam' ,0)
facedetect('facedetect',0)