本文共 4241 字,大约阅读时间需要 14 分钟。
本项目旨在利用 OpenCV 实现实时人眼检测与眨眼计数功能。通过调用 OpenCV 库函数和 cvzone 模块,我们可以高效地捕捉人眼特征,并根据眼部运动状态判断眨眼情况。本文将详细介绍系统的实现流程和技术细节。
首先,需要安装所需的开发环境。通过以下命令可以快速完成安装:
pip install opencv-pythonpip install cvzone==1.5.6pip install mediapipe==0.8.3.1
使用 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)
通过 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)
连接眼睛上下、左右四点,并计算两点间的距离。以下是实现代码:
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)
通过分析眼睛上下两点的距离变化,判断眨眼状态。以下是实现代码:
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/