3皮卡丘眨眼代码_OpenCV检测眨眼

软硬件环境

  • windows 10 64bit
  • nvidia gtx 1066
  • opencv 4.4.0
  • dlib 19.21.0
  • imutils 0.5.3

基本原理

首先使用开源库dlib的人脸检测器识别出图片中的人脸并得到68个脸部关键点,进而获取到左右眼的关键点信息,通过计算EAR(Eye Aspect Ratio),从而判定是否眨眼。

人脸68关键点信息可以参考下图

cc4d279d83500a481fc6ade7b2ee351b.png

opencv_blink

而眼部的关键点信息示意如下,对应的点是左眼37~42,右眼43~48

55f62869cc36306fae63a6fb4bb114ca.png

opencv_blink

EAR的计算公式如下

323032c4227a9b9f2f7870c590b71c4d.png

opencv_blink

当眼睛是睁开的时候,它是一个常量,当眼睛闭上的时候,逼近于0

9df5606d23b40814db4124766ab369f5.png

opencv_blink

因此,当EAR是一常量,然后快速逼近0,接着回升,就可以认为这是一次眨眼。

准备环境

由于安装dlib需要用到cmake,所以第一步要先安装cmake。下载windows版的cmake,地址是:https://cmake.org/download/,傻瓜式安装后,将安装路径(默认是C:\Program Files\CMake\bin)加入系统环境变量PATH

11d1ee78355cff46134ba7d423f62452.png

opencv_blink
pip install dlib imutils scipy opencv-python

模型下载,百度盘链接:https://pan.baidu.com/s/17VKTiwe5VzVEkGTj2FdZUQ ,提取码:xit6

实例代码

import dlib
import cv2
from scipy.spatial import distance as dist
from imutils.video import VideoStream
from imutils import face_utils
import imutils
import time


def eye_aspect_ratio(eye):
 # 计算眼部垂直方向上的2组关键点的欧氏距离
    A = dist.euclidean(eye[1], eye[5])
    B = dist.euclidean(eye[2], eye[4])

    # 计算眼部水平方向上的1组关键点的欧氏距离
    C = dist.euclidean(eye[0], eye[3])

    # 计算EAR
    ear = (A + B) / (2.0 * C)

    return ear

# EAR置信度
EYE_AR_THRESH = 0.3

# 低于置信度的连续帧数
EYE_AR_CONSEC_FRAMES = 3

# 数据帧计数器
COUNTER = 0

# 眨眼的次数
TOTAL = 0

# 初始化dlib的人脸检测器,它基于HOG
detector = dlib.get_frontal_face_detector()

# 创建脸部关键点检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

# 得到左右眼的关键点索引,左眼是37~42,右眼是43~48
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]

# 获取摄像头数据
vs = VideoStream(src=0).start()
fileStream = False
time.sleep(1.0)

while True:
 # 获取数据帧,调整大小并进行灰度化
    frame = vs.read()
    frame = imutils.resize(frame, width=450)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 得到脸的位置
    rects = detector(gray, 0)

 # 针对每一张脸进行处理
    for rect in rects:
  # 将脸部关键点信息转化成numpy的数组
        shape = predictor(gray, rect)
        shape = face_utils.shape_to_np(shape)

        # 分别计算左右眼的EAR
        leftEye = shape[lStart:lEnd]
        rightEye = shape[rStart:rEnd]
        leftEAR = eye_aspect_ratio(leftEye)
        rightEAR = eye_aspect_ratio(rightEye)

        # 取平均值
        ear = (leftEAR + rightEAR) / 2.0

  # 分别计算左右眼的凸包
        leftEyeHull = cv2.convexHull(leftEye)
        rightEyeHull = cv2.convexHull(rightEye)

  # 画眼部轮廓
        cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)
        cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)

        if ear             COUNTER += 1
        else:
            if COUNTER >= EYE_AR_CONSEC_FRAMES:
                TOTAL += 1

            # 重置计数器
            COUNTER = 0

        # 显示眨眼的次数和EAR
        cv2.putText(frame, "Blinks: {}".format(TOTAL), (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
        cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)

    # 显示图像
    cv2.imshow("Frame", frame)

    key = cv2.waitKey(1) & 0xFF

    # 按q键,退出循环
    if key == ord("q"):
        break

# 资源清理
cv2.destroyAllWindows()
vs.stop()

最后执行这段代码

python demo.py

064ccf83cbbc1cf25357ec60ed35926d.png

opencv_blink

OpenCV教程

https://xugaoxiang.com/category/ai/opencv/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值