网站申请支付宝接口,网站建设和网站设计区别,产品开发流程图模板,北京页面设计的培训基本思路 我们知道正面侦测到人脸时#xff0c;任意一只眼睛水平方向上的两个特征点构成水平距离#xff0c;上下两个特征点构成垂直距离 当头像靠近或者远离摄像头时#xff0c;垂直距离与水平距离的比值基本恒定
根据这一思路 当闭眼时 垂直距离变小 比值固定小于某一个…基本思路 我们知道正面侦测到人脸时任意一只眼睛水平方向上的两个特征点构成水平距离上下两个特征点构成垂直距离 当头像靠近或者远离摄像头时垂直距离与水平距离的比值基本恒定
根据这一思路 当闭眼时 垂直距离变小 比值固定小于某一个值 当睁眼时 比值大于某个比率比如35%我们将比值扩大一百倍 35% X 100 这样我们认为大于35时是睁眼 小于为闭眼根据程序侦测画面帧数 我们认为某一段连续的帧画面就是同一个事件 所以我们只处理其中一帧画面。基本背景知识需要用到mediapipe中人脸模型 下面给出右眼特征点编号 完整代码
import cv2
import cvzone
from cvzone.FaceMeshModule import FaceMeshDetector
from cvzone.PlotModule import LivePlot
from PIL import Image, ImageDraw, ImageFont
import numpy as npdef putText2(img,text,pos,size36,color(255,0,0)):img_pil Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))font ImageFont.truetype(fontrsimsun.ttc, sizesize)draw ImageDraw.Draw(img_pil)draw.text(pos, text, fontfont, fillcolor) # PIL中RGB(255,0,0)表示红色img_cv np.array(img_pil) # PIL图片转换为numpyimg cv2.cvtColor(img_cv, cv2.COLOR_RGB2BGR) # PIL格式转换为OpenCV的BGR格式return imgcapcv2.VideoCapture(out.mp4)
detectorFaceMeshDetector(maxFaces1)
#绘制Y坐标为20到50之间的实时波形图,宽度 高度 范围
plotYLivePlot(480,640,[20,50],invertTrue)
idEyeList[22,23,24,26,110,157,158,159,160,161,162,130]ratioList[]
blinkCouter0
counter0
color(255,0,255)
while 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,imgcap.read()# print(img.shape)img, faces detector.findFaceMesh(img,drawFalse)if faces:facefaces[0]for id in idEyeList:cv2.circle(img,face[id],5,(255,0,255),cv2.FILLED)cv2.line(img,face[159],face[23],(0,255,0),1)cv2.line(img, face[130], face[243], (0, 255, 0), 1)leftUpface[159]leftDownface[23]leftLeftface[130]leftRightface[243]#垂直距离与水平距离lengthVer,_detector.findDistance(leftUp,leftDown)lengthHor, _ detector.findDistance(leftLeft,leftRight)# print(比率,lengthVer/lengthHor)#获取随时变化的值ratioint((lengthVer/lengthHor)*100)#让波形看起来平滑ratioList.append(ratio)if len(ratioList)10:ratioList.pop(0)ratioAvgsum(ratioList)/len(ratioList)# imgPlotplotY.update(ratio)if ratioAvg40 and counter0:blinkCouter 1color(0,255,0)counter1if counter !0:counter 1#保持20毫秒内不重复计数if counter20:color(255,0,255)counter0# cvzone.putTextRect(img,fblink count:{blinkCouter},(50,50),colorR(0,255,0))cv2.rectangle(img,(50,50),(260,85),color,cv2.FILLED)imgputText2(img,f眨眼计数:{blinkCouter},(50,50),color(0,0,255))imgPlot plotY.update(int(ratioAvg),color)# cv2.imshow(Imgplot,imgPlot)cv2.resize(img, (640, 480))imgStackcvzone.stackImages([img,imgPlot],2,1)cv2.imshow(img,imgStack)cv2.waitKey(1) 截取任意一帧画面演示效果