作者:zhangmy0815522 | 来源:互联网 | 2023-09-10 09:59
参考博客:Dlib模型之驾驶员疲劳检测二(打哈欠)文章目录疲劳检测原理检测工具代码思路代码修改代码检测结果疲劳检测原理因为人在疲倦时大概会产生两种状态:眨眼:正常人的眼睛
参考博客: Dlib模型中的驾驶员疲劳检测2 (打哈欠) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。
文章目录疲劳检测原理检测工具代码思路代码修改代码检测结果疲劳检测原理
因为人在疲劳的时候大概会产生两种状态。眨眼:正常人眼睛每分钟眨眼约10-15次,每次眨眼约0.2-0.4秒。 疲劳时眨眼次数多了,速度也会变慢。打哈欠:此时,嘴巴变大,保持一定的状态。 因此,要检测人是否疲劳,可以根据眼睛的开合度、眨眼的频率、嘴巴的开合度来判断人是否疲劳。
检测工具dlib:用于图像处理的典型开源库,其中shape _ predictor _ 68 _ face _ landmarks.dat用于检测面部的68个重要点
3359 pan.Baidu.com/s/1v _ j49 iusqpmwtxtc 02 lteg
提取代码: jeu2代码构想第一步骤:使用dlib.get_frontal_face_detector ()获取面部位置检测器的第二步骤:使用dlib.shape_predictor获取面部特征然后,对图像进行维度放大并灰度化第六步骤:利用检测器(gray,0 )进行脸部位置检测的第七步骤:使脸部的位置信息循环,生成predictor(gray,0 ), 使用rect获得脸部特征位置的信息的第8步骤:将脸部的特征信息变换为数组array的格式的第9步骤:提取左眼和右眼的坐标的第10步骤:使用平均值作为最终的EAR的第11步骤: cv2.convexHull 使用drawContours描绘轮廓位置进行描绘操作的第12步骤:用矩形框标记脸部的第13步骤:分别计算左眼和右眼的得分并进行平均,如果不到阈值则加1,如果连续3次不到阈值,则进行1次眨眼显示68个特征点标记的步骤15 )进行绘图操作,同时使用cv2.putText表示眨眼次数的步骤16 )计算总眨眼次数超过50次,显示画面并睡觉。 原文链接: https://blog.csdn.net/cungudafa/article/details/103477960代码修改用于测量激情老虎距离的常用函数方法有两种。 np.linalg.norm ()和dist.euclidid )。
from scipy.spatialimportdistanceasdistimportnumpyasnpimporttimepoints=[ 1,3 ],[ 8,7 ] points=[ NP.array (val ) fal ] toc=time.clock () print(NP.LinaLG.norm:%.3fs ) (TOC-TIC ) ) ) tic=time.clock ) (forIinrange ) ) 500 () toc=time.clock ) ) print('dist.Euclidean3360%.3fs ) %(TOC-TIC ) ) (NP.linaLG.norm3360.2360 ) ) )
代码importnumpyasnpfromimutilsimportface _ utils # im utils是基于OpenCV的importimutilsimportdlibimportcv2# : #np.linalg.norm的计算时间比dist.euclidean更快,Numpy的算法a=NP.NP.norm是定义眼睛阈值和嘴阈值的数学函数) b=使用b=NP.LinaLG.norm的c=NP.LinaLG.norm(eye[0]-eye[3] ) ear=(ab )/(2.0 * C ) returneardefmouth
mar = (A + B) / (2.0 * C) return mar#常数:眼睛长宽比/闪烁阈值eye_Aspect_rato = 0.2eye_Flicker_threshold = 3#常数:嘴长宽比/闪烁阈值mouth_Aspect_rato = 0.5mouth_Flicker_threshold = 3#计数常数eCOUNTER = 0eTOTAL = 0mCOUNTER = 0mTOTAL = 0#脸部位置检测器#返回值就是一个矩形detect = dlib.get_frontal_face_detector()#脸部特征位置检测器predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')#获得左右眼和嘴的标志索引(lstart,lend) = face_utils.FACIAL_LANDMARKS_IDXS['left_eye'](rstart,rend) = face_utils.FACIAL_LANDMARKS_IDXS['right_eye'](mstart,mend) = face_utils.FACIAL_LANDMARKS_IDXS['mouth']cap = cv2.VideoCapture(0)while True: ret,frame = cap.read() frame = imutils.resize(frame)#, Blinks:{}'.format(eTOTAL),(10,30),cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,0,255),2) cv2.putText(frame,'eCounter:{}'.format(eCOUNTER), (150, 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) if mar > mouth_Aspect_rato: #阈值0.5 mCOUNTER += 1 else: if mCOUNTER >= mouth_Flicker_threshold: #阈值3 mTOTAL += 1 mCOUNTER = 0 cv2.putText(frame, 'Yawning:{}'.format(mTOTAL), (10,60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.putText(frame, 'mCounter:{}'.format(mCOUNTER), (300,60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.putText(frame, 'Mar:{:.2f}'.format(mar), (450, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) #进行画图操作,68个特征点标识 #for (x,y) in shape: #shape为68特征点的坐标 #cv2.circle(frame,(x,y),1,(0,0,255),-1) #假设1秒为60帧,则1帧为1/60秒,一个TOTAL为3帧为1/20秒 if eTOTAL >= 12 or mTOTAL >= 6: cv2.putText(frame,"SLEEP!SLEEP!!",(360,360),cv2.FONT_HERSHEY_SIMPLEX,1,(84,255,200),2) cv2.imshow('pilao',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break #也许是因为我用的opencv-python是4.1.0 所以加上最后这两行总是报错,我删掉后就可以运行了 #cap.release() #cv2.destroyAllWindows() 检测结果