使用opencv进行实时人脸+眼睛+微笑检测

      在使用OpenCV进行人脸+眼睛+微笑检测之前,需要下载OpenCV提供好的级联分类器。
      下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades

代码:

import cv2

# 导入级联分类器引擎
face_cascade = cv2.CascadeClassifier("opencv-master\data\haarcascades\haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier("opencv-master\data\haarcascades\haarcascade_eye.xml")
smile_cascade = cv2.CascadeClassifier("opencv-master\data\haarcascades\haarcascade_smile.xml")

# 调用摄像头
cap = cv2.VideoCapture(0)

while (True):
    # 获取摄像头拍摄到的画面
    # cap.read()返回两个参数。ret:值为true或false,表示获取画面成功或失败, frame:获取到的画面是三维数组
    ret, frame = cap.read()
    
    # 用人脸级联分类器引擎进行人脸识别,返回的faces为人脸坐标列表,1.3是放大比例,2是重复次数(越大精确度越高)
    faces = face_cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(32, 32))
    img = frame
   
    for (x,y,w,h) in faces:
        # 画出人脸框,蓝色,画笔宽度为2
        # (x,y):左上角坐标  (x+w,y+h):右下角坐标
        img = cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)

        # 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源
        face_area = img[y:y+h, x:x+w]

        # 用人眼级联分类器引擎在人脸区域进行人眼检测,返回的eyes为眼睛坐标列表[ex,ey,ew,eh]
        eyes = eye_cascade.detectMultiScale(face_area, scaleFactor=1.3, minNeighbors=10)

        for (ex,ey,ew,eh) in eyes:
       		# 画出人眼眶,绿色,画笔宽度为1
            cv2.rectangle(face_area, (ex,ey), (ex+ew,ey+eh), (0,0,255),1)

        # 用微笑级联分类器引擎在人脸区域进行微笑检测
        smiles = smile_cascade.detectMultiScale(face_area, scaleFactor = 1.16, minNeighbors= 65, minSize=(25,25), flags = cv2.CASCADE_SCALE_IMAGE)

        for (ex,ey,ew,eh) in smiles:
            # 画出微笑框,红色(BGR色彩体系),画笔宽度为1
            cv2.rectangle(face_area, (ex,ey), (ex+ew,ey+eh), (0,0,255), 1)
            cv2.putText(img, "smile", (x,y-7), 3, 1.2, (0,0,225), 2, cv2.LINE_AA)

    # 实时展示效果画面
    cv2.imshow("my_window", img)
    
    # 每5毫秒监听一次键盘动作,按q键结束
    if cv2.waitKey(5) & 0xFF == ord("q"):
        break

# 关闭摄像头
cap.release()
# 关闭所有窗口
cv2.destroyAllWindows()

局限性

● 仅为人脸检测,非人脸识别,即只能框出人脸位置,看不出人脸是谁。
● 仅能标出静态图片和视频帧上的人脸、眼睛和微笑,不能进行“活体识别”,即不能看出这张脸是真人还是手机上的照片,如果用于人脸打卡签到,人脸支付的话会带来潜在的安全风险
● 仅为普通的机器学习方法(基于haar特征的级联分类器),没有用到深度学习和深层神经网络。

猜你喜欢

转载自blog.csdn.net/Roaddd/article/details/112055173