博客
关于我
OpenCV实战:人眼检测+眨眼计数
阅读量:798 次
发布时间:2023-04-15

本文共 4241 字,大约阅读时间需要 14 分钟。

OpenCV 实现眨眼检测与计数

项目简介

本项目旨在利用 OpenCV 实现实时人眼检测与眨眼计数功能。通过调用 OpenCV 库函数和 cvzone 模块,我们可以高效地捕捉人眼特征,并根据眼部运动状态判断眨眼情况。本文将详细介绍系统的实现流程和技术细节。

实战步骤

1. 环境搭建

首先,需要安装所需的开发环境。通过以下命令可以快速完成安装:

pip install opencv-pythonpip install cvzone==1.5.6pip install mediapipe==0.8.3.1

2. 视频加载

使用 OpenCV 加载视频文件,并设置视频显示窗口。以下是代码示例:

import cv2cap = cv2.VideoCapture('Videos/2.mp4')  # 加载视频while True:    success, img = cap.read()  # 读取视频    img = cv2.resize(img, (640, 360))  # 设置视频分辨率    cv2.imshow('Image', img)    cv2.waitKey(1)

3. 人眼检测

通过 cvzone 的 FaceMeshDetector 方法,可以快速检测人眼特征。以下是实现代码:

import cv2import cvzonefrom cvzone.FaceMeshModule import FaceMeshDetectorcap = cv2.VideoCapture('Videos/2.mp4')  # 加载视频detector = FaceMeshDetector(maxFaces=1)  # 初始化检测器idList = [22, 23, 24, 26, 110, 157, 158, 159, 160, 161, 130, 243]  # 左眼坐标color = (255, 0, 255)  # 设置画笔颜色while True:    success, img = cap.read()  # 读取视频    img, faces = detector.findFaceMesh(img, draw=False)  # 检测人脸特征    if faces:        face = faces[0]        for id in idList:            cv2.circle(img, face[id], 20, color, cv2.FILLED)  # 绘制左眼    img = cv2.resize(img, (640, 360))  # 设置视频分辨率    cv2.imshow('Image', img)    cv2.waitKey(1)

4. 眼睛连线

连接眼睛上下、左右四点,并计算两点间的距离。以下是实现代码:

import cv2import cvzonefrom cvzone.FaceMeshModule import FaceMeshDetectorcap = cv2.VideoCapture('Videos/2.mp4')  # 加载视频detector = FaceMeshDetector(maxFaces=1)  # 初始化检测器idList = [22, 23, 24, 26, 110, 157, 158, 159, 160, 161, 130, 243]  # 左眼坐标color = (255, 0, 255)  # 设置画笔颜色while True:    success, img = cap.read()  # 读取视频    img, faces = detector.findFaceMesh(img, draw=False)  # 检测人脸特征    if faces:        face = faces[0]        for id in idList:            cv2.circle(img, face[id], 20, color, cv2.FILLED)  # 绘制左眼                leftUp = face[159]        leftDown = face[23]        leftLeft = face[130]        leftRight = face[243]                cv2.line(img, leftUp, leftDown, (0, 200, 0), 3)  # 连接上下两点        cv2.line(img, leftLeft, leftRight, (0, 200, 0), 3)  # 连接左右两点                lengthVer = int(detector.findDistance(leftUp, leftDown)[0])  # 垂直距离        lengthHor = int(detector.findDistance(leftLeft, leftRight)[0])  # 水平距离    img = cv2.resize(img, (640, 360))  # 设置视频分辨率    cv2.imshow('Image', img)    cv2.waitKey(1)

5. 眨眼计数

通过分析眼睛上下两点的距离变化,判断眨眼状态。以下是实现代码:

import cv2import cvzonefrom cvzone.FaceMeshModule import FaceMeshDetectorfrom cvzone.PlotModule import LivePlotcap = cv2.VideoCapture('Videos/2.mp4')  # 加载视频detector = FaceMeshDetector(maxFaces=1)  # 初始化检测器plotY = LivePlot(640, 360, [20, 50], invert=True)  # 初始化绘图器idList = [22, 23, 24, 26, 110, 157, 158, 159, 160, 161, 130, 243]  # 左眼坐标color = (255, 0, 255)  # 设置画笔颜色BlinkCounter = 0ratioList = []counter = 0while True:    if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT):        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)  # 重复播放视频        success, img = cap.read()  # 读取视频    img, faces = detector.findFaceMesh(img, draw=False)  # 检测人脸特征    if faces:        face = faces[0]        for id in idList:            cv2.circle(img, face[id], 20, color, cv2.FILLED)  # 绘制左眼                leftUp = face[159]        leftDown = face[23]        leftLeft = face[130]        leftRight = face[243]                cv2.line(img, leftUp, leftDown, (0, 200, 0), 3)  # 连接上下两点        cv2.line(img, leftLeft, leftRight, (0, 200, 0), 3)  # 连接左右两点                lengthVer = int(detector.findDistance(leftUp, leftDown)[0])  # 垂直距离        lengthHor = int(detector.findDistance(leftLeft, leftRight)[0])  # 水平距离                ratio = int((lengthVer / lengthHor) * 100)  # 长度比        print(f'比例:{ratio}')        ratioList.append(ratio)                if len(ratioList) > 3:            ratioList.pop(0)        ratioAvg = sum(ratioList) / len(ratioList)  # 长度比均值        print(f'均值:{ratioAvg}')                imgPlot = plotY.update(ratioAvg)  # 更新绘图        img = cv2.resize(img, (640, 360))  # 设置视频分辨率        imgStack = cvzone.stackImages([img, imgPlot], 2, 1)  # 组合图像    else:        img = cv2.resize(img, (640, 360))  # 设置视频分辨率        imgStack = cvzone.stackImages([img, img], 2, 1)  # 组合图像        cv2.imshow('Image', imgStack)    cv2.waitKey(1)

最后

通过本文的实现,您可以轻松地在视频中实时检测人眼,并根据眼部运动状态判断眨眼情况。该系统具有高效的检测速度和准确的眨眼计数功能,适用于多种人脸识别和眼动监测场景。希望本文的内容能够为您的项目提供有价值的参考,让我们一起探索更多精彩的技术之门!

转载地址:http://ewgfk.baihongyu.com/

你可能感兴趣的文章