驾驶员疲劳驾驶检测技术(驾驶员疲劳检测的方法主要有哪些)

作者:电脑培训网 2024-04-27 19:28:04 110

璁$畻鏈鸿瑙夐」鐩疄璺?椹鹃┒鍛樼柌鍔虫娴嬫杩庢潵鍒版湰鍗氬

鏈瘒鍗氬鍐呭灏嗙户缁瑙penCV鐨勭浉鍏崇煡璇?

驾驶员疲劳驾驶检测技术(驾驶员疲劳检测的方法主要有哪些)

鍏充簬浣滆€咃細鐩墠姝e湪鏀昏璁$畻鏈虹瀛︿笓涓氱殑鐮旂┒鐢熴€備富瑕佺爺绌舵柟鍚戜负浜哄伐鏅鸿兘鍜岀兢浣撴櫤鑳界畻娉曘€傜洰鍓嶇啛鎮夋繁搴﹀涔狅紙keras銆乸ytorch銆亂olo锛夈€乸ython缃戠粶鐖櫕銆佹満鍣ㄥ涔犮€佽绠楁満瑙嗚锛圤penCV锛夈€佺兢浣撴櫤鑳界畻娉曘€傜劧鍚庢垜姝e湪瀛︿範娣卞害瀛︿範銆傛湭鏉ュ彲鑳戒細娑夊強鍒扮綉缁滃畨鍏ㄧ浉鍏崇殑棰嗗煙銆傛瘯绔燂紝杩欐槸姣忎釜璁$畻鏈哄鐢熺殑姊︽兂锛?

鐩墠鏇存柊锛氱綉缁滅埇铏€佹満鍣ㄥ涔犮€佽绠楁満瑙嗚鐩稿叧鐭ヨ瘑-OpenCV鐩稿叧鍐呭宸叉洿鏂般€?

鏈枃鎽樿

鍦ㄨ繖绡囨枃绔犱腑锛屾垜浠皢缁х画璁茶В璁$畻鏈鸿瑙夐鍩熺殑椤圭洰鈥斺€旈┚椹跺憳鐤插姵妫€娴嬨€?

鏂囩珷鐩綍

椤圭洰鍓嶈█銆侀」鐩鐐广€侀」鐩唬鐮佽瑙c€侀」鐩粨鏋滃睍绀恒€侀」鐩敼杩涙柟鍚戯紙鎵撳搱娆犳娴嬬柌鍔虫硶锛夈€侀」鐩敼杩涙柟鍚戯紙鐐瑰ご妫€娴嬬柌鍔筹級銆丟UI鐣岄潰璁捐灞曠ず

椤圭洰鍓嶈█

鍦ㄤ笂涓€绡囧崥瀹腑锛屾垜浠璁轰簡濡備綍瀹氫綅浜鸿劯銆傚苟瀹氫綅浜鸿劯涓婄殑鍏抽敭鐐广€傚叾涓寘鎷?鐐瑰畾浣嶅拰68鐐瑰畾浣嶃€傚畾浣嶄箣鍚庯紝鎴戜滑鍙互鍒╃敤瀹氫綅淇℃伅鍋氫竴浜涚浉鍏崇殑鎿嶄綔锛屾瘮濡傞棴鐪兼娴嬶紝鍙互搴旂敤浜庨┚椹跺憳鐤插姵妫€娴嬶紝鎴栬€呴绻佷娇鐢ㄧ數鑴戠瓑銆傚浜庝笉闂溂鐨勪汉鏉ヨ锛屽彲鑳戒細瀵艰嚧鐪肩潧骞叉订銆?

椤圭洰鍏抽敭鐐硅瑙?/h2>

鎴戜滑鐨勫崥瀹富瑕佽瑙e浣曢€氳繃闂溂鏉ユ娴嬬柌鍔抽┚椹讹紝鎵€浠ユ垜浠鍏堣浜嗚В濡備綍璁╄绠楁満鍒ゆ柇涓€涓汉鏄惁闂溂銆備粠涓婁竴绡囧崥瀹㈡垜浠彲浠ョ煡閬擄紝鎴戜滑棣栧厛闇€瑕佽绠楁満璇嗗埆浜鸿劯锛岀劧鍚庡湪璇嗗埆鍑虹殑浜鸿劯涓婄户缁鎵惧叧閿偣銆傛垜浠繖閲屼娇鐢ㄧ殑鏄?8涓叧閿偣妫€娴嬨€?

鑷充簬鐪肩潧锛屼粬鐨勬瘡鍙溂鐫涢兘鏈?涓噸鐐广€傝繖閲屾垜浠彲浠ョ敤涓€绉嶆柟娉曟潵鍒ゆ柇鏄惁鍙戠敓浜嗙湪鐪笺€?

鍦ㄧ溂鐫涚殑6涓叧閿偣涓紝鎴戜滑鍙互鍙戠幇锛屽綋鐪肩潧鐫佸紑鏃讹紝鐐?鍜?涔嬮棿浠ュ強鐐?鍜?涔嬮棿鐨勬姘忚窛绂昏緝澶с€傜偣1鍜岀偣4涔嬮棿鐨勮窛绂讳細绋嶅井澧炲姞锛岀劧鍚庢垜浠彲浠ヨ缃竴涓叕寮忋€?

鐩稿簲鍦板湪鍥句笂锛屽噺鍘荤偣2鍜?锛屽噺鍘荤偣3鍜?銆傜劧鍚庢瘮杈?鍜?鐐圭殑宸€?鍊嶃€傚畠浠兘鏄粷瀵瑰€笺€傝繖鏍凤紝鐫佺溂鏃禘AR鐨勫€间細杈冨ぇ锛岄棴鐪兼椂EAR鐨勫€间細杈冨皬銆傜劧鍚庢垜浠嚜宸辫缃竴涓槇鍊硷紝濡傛灉瑙嗛甯т腑瓒呰繃鍑犲抚鐨凟AR鍊间綆浜庤繖涓槇鍊笺€傜劧鍚庢垜浠亣璁惧徃鏈洪棴涓婁簡鐪肩潧銆?

缁忚繃璁烘枃楠岃瘉锛岃〃鏄庤鏂规硶鐨勫噯纭€ч潪甯稿彲瑙傦紝骞朵笖鍏锋湁寰堝己鐨勯瞾妫掓€с€?

椤圭洰浠g爜璇﹁В

棣栧厛锛屾垜浠鍏ュ伐鍏峰寘锛屽叾涓繕鍖呮嫭璁$畻娆ф皬璺濈鐨勫伐鍏峰寘銆?

fromscipy.spatialimportdistanceasdistfromcollectionsimportOrderedDictimportnumpyasnpimportargparseimporttimeimportdlibimportcv2

鐒跺悗鎴戜滑瀹氫綅浜?8涓叧閿偣瀹氫綅淇℃伅銆?

FACIAL_LANDMARKS_68_IDXS=OrderedDict([('鍢村反',(48,68)),('鍙崇溂鐪?,(17,22)),('宸︾溂鐪?,(22,27)),('鍙崇溂',(36,42))),('宸︾溂',(42,48)),('榧诲瓙',(27,36)),('涓嬪反',(0,17))])

杩欓噷'jaw',(0,17)琛ㄧず涓嬪反浣嶇疆鐨勫叧閿偣鏍囪瘑锛屽垎鍒槸0-17鐐广€?

鐒跺悗鎴戜滑灏嗛渶瑕佺殑妯″瀷鍜岃棰戝鍏ュ埌绋嬪簭涓€傚叧閿偣妫€娴嬫ā鍨嬨€?

ap=argparse.ArgumentParser()ap.add_argument('-p','--shape-pdictor',required=True,help='闈㈤儴鐗瑰緛鐐筽dictor鐨勮矾寰?)ap.add_argument('-v','--video',type=str,default='',help='杈撳叆瑙嗛鏂囦欢鐨勮矾寰?)args=vars(ap.parse_args())

EYE_AR_THRESH=0.3EYE_AR_CONSEC_FRAMES=3

杩欎袱涓弬鏁板湪杩欓噷闈炲父閲嶈锛屽叾涓璄YE_AR_THRESH浠h〃EAR鐨勯槇鍊笺€傚鏋滈珮浜庤繖涓槇鍊硷紝鍒欒鏄庢鏃朵汉鐨勭溂鐫涙槸鐫佸紑鐨勩€傚鏋滀綆浜庤繖涓槇鍊硷紝閭d箞杩欎釜鏃跺€欏氨瑕佹敞鎰忎簡锛屽徃鏈哄彲鑳芥槸闂潃鐪肩潧鐨勩€傝€孍YE_AR_CONSEC_FRAMES琛ㄧず濡傛灉EAR鍊艰秴杩囦笁甯ф垨鏇村锛屾垜浠氨鍙互璇嗗埆涓洪棴鐪笺€備负浠€涔堣涓夊抚锛熷洜涓哄鏋滀竴甯ф湁涓ゅ抚鐨勮瘽锛屽彲鑳戒細鍙楀埌鍏朵粬鍥犵礌鐨勫奖鍝嶃€?

璁℃暟鍣?0鎬昏=0

鐒跺悗鎴戜滑鍐嶈缃袱涓鏁板櫒銆傚鏋滃皬浜庨槇鍊硷紝鍒機OUNTER鐨勫€煎皢鍔?銆傚綋COUNTER鐨勫€煎ぇ浜庣瓑浜?鏃讹紝TOTAL浼氬姞1锛岃〃绀鸿褰曠殑鐪肩潧闂溂涓€娆°€?

print('[INFO]鍔犺浇闈㈤儴鏍囧織pdictor.')detector=dlib.get_frontal_face_detector()pdictor=dlib.shape_pdictor(args['shape_pdictor'])

鎴戜滑瀵硅繖閲岄潪甯哥啛鎮夈€備竴涓槸浜鸿劯瀹氫綅鍣紝鍙︿竴涓槸鍏抽敭鐐规娴嬪櫒銆傚湪杩欓噷鍒嗗埆鎶婁粬浠彨鍑烘潵銆?

(lStart,lEnd)=FACIAL_LANDMARKS_68_IDXS['left_eye'](rStart,rEnd)=FACIAL_LANDMARKS_68_IDXS['right_eye']

鐒跺悗鎴戜滑鍙€氳繃鍏抽敭鐐瑰彇涓や釜ROI鍖哄煙锛屽嵆宸︾溂鍖哄煙鍜屽彸鐪煎尯鍩熴€?

print('[INFO]鍚姩瑙嗛娴佺嚎绋?')vs=cv2.VideoCapture(args['video'])

鐒跺悗鎴戜滑鍦ㄨ棰戜腑闃呰銆?

whileTrue:#棰勫鐞唂rame=vs.read()[1]ifframeisNone:break(h,w)=frame.shape[:2]width=1200r=width/float(w)dim=(width,int(h*r)))frame=cv2.resize(frame,dim,interpolation=cv2.INTER_AREA)gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

绋嶅井鏀惧ぇ瑙嗛鏄剧ず妗嗐€傝繖閲岀殑鍏抽敭鏄紝濡傛灉瑙嗛甯ц缃緱澶皬锛屽彲鑳芥棤娉曟娴嬪埌浜鸿劯銆傜劧鍚庢垜浠皢瀹藉害璁剧疆涓?200锛岀劧鍚庝互鐩稿悓鐨勬瘮渚嬭皟鏁撮暱搴︺€傛渶鍚庤浆鎹负鐏板害鍥惧儚銆?

鐭╁舰=妫€娴嬪櫒(鐏拌壊锛?0)

杩欓噷妫€娴嬪埌浜鸿劯锛屽緱鍒颁汉鑴告鐨勫洓涓潗鏍囥€傝娉ㄦ剰锛屽繀椤诲鐏板害鍥惧儚杩涜澶勭悊銆?

forrectinrects:#鑾峰彇鍧愭爣shape=pdictor(gray,rect)shape=shape_to_np(shape)

杩欓噷杩涜浜鸿劯妗嗛亶鍘嗭紝妫€娴嬪埌68涓叧閿偣銆?

defshape_to_np(shape,dtype='int'):#鍒涘缓68*2coords=np.zeros((shape.num_parts,2),dtype=dtype)#閬嶅巻姣忎釜鍏抽敭鐐?鑾峰彇range(0,shape.num_parts):coords[i]=(shape.part(i).x,shape.part(i).y)杩斿洖鍧愭爣

杩欐槸鎻愬彇鐨勫叧閿偣鐨勫潗鏍囥€?

leftEye=褰㈢姸[lStart:lEnd]rightEye=褰㈢姸[rStart:rEnd]leftEAR=eye_aspect_ratio(leftEye)rightEAR=eye_aspect_ratio(rightEye)

鐒跺悗鎴戜滑鍒嗗埆璁$畻浜嗗乏鐪煎拰鍙崇溂鐨凟AR鍊笺€傝繖閲岀殑eye_aspect_ratio鍑芥暟鐢ㄤ簬璁$畻EAR鍊笺€?

defeye_aspect_ratio(eye):#璁$畻鍨傜洿璺濈A=dist.euclidean(eye[1],eye[5])B=dist.euclidean(eye[2],eye[4])#璁$畻姘村钩璺濈C=dist.euclidean(eye[0],eye[3])#鑰虫湹鍊艰€虫湹=(A+B)/(2.0*C)杩斿洖鑰虫湹

鍏朵腑锛宒ist.euclidean琛ㄧず璁$畻娆ф皬璺濈锛屼笌鍏紡涓绠桬AR鍊煎畬鍏ㄧ浉鍚屻€?

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)

鐒跺悗瀵瑰乏鐪煎拰鍙崇溂杩涜EAR姹傝В骞舵眰骞冲潎鍊硷紝鐒跺悗鍩轰簬鍑稿寘鐨勬蹇电粯鍒剁溂閮ㄥ尯鍩熴€傜敾鍑哄乏鐪煎尯鍩熷拰鍙崇溂鍖哄煙銆?

ifEarEYE_AR_THRESH:COUNTER+=1else:#濡傛灉鐪肩潧杩炵画闂嚑甯э紝鍒欐€昏璁$畻涓€娆fCOUNTER=EYE_AR_CONSEC_FRAMES:TOTAL+=1#閲嶇疆COUNTER=0#鏄剧ずcv2.putText(frame,'Blinks:{}'.format(鍚堣),(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(10)0xFFifkey==27:breakvs.release()cv2.destroyAllWindows()

鏈€鍚庤繘琛岄槇鍊煎垽鏂€傚鏋滆繛缁笁甯AR閮藉皬浜?.3锛岄偅涔堟垜浠皢TOTAL鍔?锛屼粠鑰岃褰曢棴鐪肩殑杩囩▼銆傛渶鍚庡湪瑙嗛涓樉绀篍AR鍊煎拰TOTAL鍊笺€傛渶缁堝畬鎴愭暣浣撹缁冦€?

椤圭洰缁撴灉灞曠ず

椤圭洰鏀硅繘鏂瑰悜锛堟墦鍝堟瑺妫€娴嬬柌鍔虫柟娉曪級{[标签占位]}

鎴戜滑鐭ラ亾鍦ㄧ柌鍔虫娴嬩腑锛岀湪鐪肩殑鍏夋娴嬪彲鑳戒笉鏄壒鍒噯纭紝鎵€浠ユ垜浠繕闇€瑕佺粨鍚堝叾浠栬兘澶熻〃鐜伴┚椹跺憳鐤插姵鐨勭偣鏉ユ樉绀洪┚椹跺憳鏄惁澶勪簬鐤插姵椹鹃┒闃舵銆傛垜浠簡瑙e埌锛屾墦鍝堟瑺鍜岀偣澶翠篃鍙兘琛ㄦ槑椹鹃┒鍛樼柌鍔炽€傛垜浠鍏堣€冭檻涓€涓嬫墦鍝堟瑺鐨勬儏鍐点€?

棣栧厛鎴戜滑鏉ョ湅鐪嬪槾宸寸殑閲嶇偣銆?

鎴戜滑瀵圭湪鐪兼娴嬩娇鐢ㄧ浉鍚岀殑鏂规硶缁х画瀵瑰槾宸翠娇鐢ㄧ浉鍚岀殑鏂规硶鏉ユ娴嬪槾宸存槸鍚﹀紶寮€锛佺浉搴旂殑鍏紡涓猴細{[标签占位]}

defmouth_aspect_ratio(鍢?:A=np.linalg.norm(鍢碵2]-鍢碵9])#51,59B=np.linalg.norm(鍢碵4]-鍢碵7])#53,57C=np.linalg.norm(鍙0]-鍙6])#49,55mar=(A+B)/(2.0*C)returnmar

杩欓噷鎴戜滑閫夋嫨鍢撮儴鍖哄煙鐨?涓偣鏉ュ垽鏂徃鏈烘槸鍚﹀紶寮€浜嗗槾锛?

MAR_THRESH=0.5MOUTH_AR_CONSEC_FRAMES=3

鎴戜滑杩橀渶瑕佽缃竴涓槇鍊硷紝鍏惰В閲婁笌鐪ㄧ溂妫€娴嬬浉鍚屻€?

(mStart,mEnd)=FACIAL_LANDMARKS_68_IDXS['鍢?]

棣栧厛锛屾垜浠緱鍒?8涓叧閿偣涓搴旂殑鍢撮儴鍖哄煙銆?

鍢?褰㈢姸[mStart:mEnd]mar=鍢撮暱瀹芥瘮(鍢?

鐒跺悗浣跨敤鍑芥暟mouth_aspect_ratio鏉ヨ绠梞ar鍊硷紒鐒跺悗杩涜鍑稿寘妫€娴嬪苟缁樺埗銆?

mouthHull=cv2.convexHull(mouth)cv2.drawContours(frame,[mouthHull],-1,(0,255,0),1)

left=rect.left()#缁樺埗浜鸿劯妗嗘灦top=rect.top()right=rect.right()bottom=rect.bottom()cv2.rectangle(frame,(left,top),(right,Bottom),(0,255,0),3)

杩欓噷闇€瑕佽ˉ鍏呯殑鏄紝鎴戜滑闇€瑕佺粯鍒惰劯閮ㄦ鏋讹紒

ifmarMAR_THRESH:#寮犲彛闃堝€?.5mCOUNTER+=1cv2.putText(frame,'鎵撳懙娆?',(10,60),cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,0,255),2)else:#濡傛灉杩炵画3娆″鏋滃皬浜庨槇鍊硷紝鍒欒〃绀烘墦鍝堟瑺ifmCOUNTER=MOUTH_AR_CONSEC_FRAMES:#闃堝€硷細3mTOTAL+=1#閲嶇疆鍢村抚璁℃暟鍣╩COUNTER=0cv2.putText(frame,'Yawning:{}'.format(mTOTAL),(150,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),(480,60),cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,0,255),2)

鐒跺悗鍋氬嚭鍒ゆ柇骞跺湪瑙嗛涓睍绀哄嚭鏉ワ紒

椤圭洰鏀硅繘鏂瑰悜锛堢偣澶存娴嬬柌鍔筹級

娴嬭瘯杩囩▼锛?

2D浜鸿劯鍏抽敭鐐规娴嬶紱3D浜鸿劯妯″瀷鍖归厤锛涙眰瑙?D鐐逛笌瀵瑰簲2D鐐逛箣闂寸殑杞崲鍏崇郴锛涘熀浜庢棆杞煩闃垫眰瑙f鎷夎銆?

鐗╀綋鐩稿浜庣浉鏈虹殑濮挎€佸彲浠ヤ娇鐢ㄦ棆杞煩闃靛拰骞崇Щ鐭╅樀鏉ヨ〃绀恒€?

!]()

娆ф媺瑙?

绠€鍗曟潵璇达紝娆ф媺瑙掑氨鏄墿浣撶粫鍧愭爣绯荤殑涓変釜鍧愭爣杞达紙x銆亂銆亃杞达級鐨勬棆杞搴︺€備笘鐣屽潗鏍囩郴涓庡叾浠栧潗鏍囩郴涔嬮棿鐨勮浆鎹?

涓栫晫鍧愭爣绯诲埌鐩告満鍧愭爣绯荤殑杞崲锛?

鐩告満鍧愭爣绯诲埌鍍忕礌鍧愭爣绯荤殑杞崲锛?

鍥犳锛屽儚绱犲潗鏍囩郴涓庝笘鐣屽潗鏍囩郴鐨勫叧绯诲涓嬶細

鐒跺悗鎴戜滑鎸夌収璁烘枃瀹氫箟锛歰bject_pts=np.float32([[6.825897,6.760612,4.402142],#33宸︾湁宸︿笂瑙抂1.330353,7.122144,6.903745],#29宸︾湁鍙宠[-1.330353,7.122144,6.903745],#34鍙崇湁宸︿笂瑙抂-6.825897,6.760612,4.402142],#38鍙崇湁鍙充笂瑙抂5.311432,5.485328,3.987654],#13宸︾溂宸︿笂瑙抂1.789930,5.393625銆?.413414],#17宸︾溂鍙充笂瑙抂-1.789930,5.393625,4.413414],#25鍙崇溂宸︿笂瑙抂-5.311432,5.485328,3.987654],#21鍙崇溂鍙充笂瑙抂2.005628,1.409845,6.165652],#55榧诲瓙宸︿笂瑙抂-2.005628,1.409845,6.165652],#49榧诲瓙鍙充笂瑙抂2.774015,-2.080775,5.048531],#43宸︿笂瑙掑槾宸-2.774015锛?2.080775锛?.048531]锛?9鍢村彸瑙抂0.00000000锛?3.116408锛?.0976667]锛?5鍢村槾瑙掍笅瑙抂0.000000锛?7.415691锛?15691锛?.070434]锛?6.5308391993466671e+002,0.0,3.1950000000000000e+002,0.0,6.5308391993466671e+002,2.3950000000000000e+002,0.0,0.0,1.0]#绛変环鍩轰簬鐭╅樀[fx,0,cx;0銆乫y銆乧y锛?0,0,1]#鍥惧儚涓績鍧愭爣绯伙紙uv锛夛細鐩告満鐣稿彉鍙傛暟[k1,k2,p1,p2,k3]D=[7.0834633684407095e-002,6.9140193737175351e-002,0.0,0.0,-1.3073460323689292e+000]reprojectsrc=np.float32([[10.0,10.0,10.0],[10.0,10.0,-10.0],[10.0,-10.0,-10.0],[10.0,-10.0,10.0],[-10.0,10.0,10.0],[-10.0,10.0,-10.0],[-10.0,-10.0,-10.0],[-10.0,-10.0,10.0]])#缁樺埗姝f柟浣?2杞寸嚎line_pairs=[[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]]

鍏朵腑reprojectsrc鍜宭ine_pairs灞炰簬鐭╁舰鍜岀煩褰㈣繛鎺ユ鐨勬搷浣溿€傜◢鍚庝細鐢ㄥ埌銆?

cam_matrix=np.array(K).reshape(3,3).astype(np.float32)dist_coeffs=np.array(D).reshape(5,1).astype(np.float32)

杩欓噷鎴戜滑閲嶅浜咾鍜孌鐭╅樀锛?

defget_head_pose(shape):#澶撮儴濮挎€佷及璁?锛堝儚绱犲潗鏍囬泦锛夊~鍐?D鍙傝€冪偣锛屾爣娉ㄥ涓媓宸︾湁姣涘乏涓婅/21宸︾湁鍙宠/22鍙崇湁宸︿笂瑙?26鍙崇湁鍙充笂瑙?36宸︾溂宸︿笂瑙?39宸︾溂鍙充笂瑙?42鍙崇溂宸︿笂瑙?#45鍙充笂鍙崇溂瑙?31榧诲瓙宸︿笂瑙?35榧诲瓙鍙充笂瑙?48宸︿笂瑙?54鍙充笂瑙?57鍢磋涓績/8涓嬪反瑙抜mage_pts=np.float32([shape[17]銆佸舰鐘禰21]銆佸舰鐘禰22]銆佸舰鐘禰26]銆佸舰鐘禰36]銆佸舰鐘禰39]銆佸舰鐘禰42]銆佸舰鐘禰45]銆佸舰鐘禰31]銆佸舰鐘禰35]銆佸舰鐘禰48],shape[54],shape[57],shape[8]])#solvePnP璁$畻浣嶅Э鈥斺€旇В鏃嬭浆鍜屽钩绉荤煩闃碉細#rotation_vec琛ㄧず鏃嬭浆鐭╅樀锛宼ranslation_vec琛ㄧず骞崇Щ鐭╅樀锛宑am_matrix瀵瑰簲K鐭╅樀锛?dist_coeffs瀵瑰簲浜嶥鐭╅樀銆?_,rotation_vec,translation_vec=cv2.solvePnP(object_pts,image_pts,cam_matrix,dist_coeffs)#projectPoints閲嶆姇褰辫宸細鍘熷2d鐐逛笌閲嶆姇褰?d鐐逛箣闂寸殑璺濈锛堣緭鍏?d鐐广€佺浉鏈哄唴鍙傘€佺浉鏈虹暩鍙樸€乺銆乼,杈撳嚭Reproject2d鐐?reprojectdst,_=cv2.projectPoints(reprojectsrc,rotation_vec,Translation_vec,cam_matrix,dist_coeffs)reprojectdst=tuple(map(tuple,reprojectdst.reshape(8,2)))#浠?琛?鍒楁樉绀?璁$畻娆ф媺瑙抍alceulerangle#鍙傝€僪(rotation_vec)#Rodrigues鍏紡锛堝皢鏃嬭浆鐭╅樀杞崲涓烘棆杞悜閲忥級pose_mat=cv2.hconcat((rotation_mat,Translation_vec))#姘村钩鎷兼帴锛寁concat鍨傜洿鎷兼帴#decomposeProjectionMatrix灏嗘姇褰辩煩闃靛垎瑙d负鏃嬭浆鐭╅樀鍜岀浉鏈虹煩闃礯,_,_,_,_,_,euler_angle=cv2.decomposeProjectionMatrix(pose_mat)淇话銆佸亸鑸€佹粴杞?[math.radians(_)for_ineuler_angle]pitch=math.Degrees(math.asin(math.sin(pitch)))roll=-math.Degrees(math.asin(math.sin)(roll)))yaw=math.Degrees(math.asin(math.sin(yaw)))print('pitch:{},yaw:{},roll:{}'.format(pitch,yaw,roll))returnreprojectdst,euler_angle#鎶曞奖璇樊锛屾鎷夎

杩欓噷鎴戜滑瀹氫綅浜嗕竴浜涘叧閿偣锛屽苟灏嗕笘鐣屽潗鏍囩郴杞崲涓?D鍧愭爣銆傛渶鍚庢垜浠€氳繃CV2璁$畻鍑烘鎷夎锛岃繖鏍锋垜浠氨鍙互鍒ゆ柇鍙告満鏄惁鐐瑰ご浜嗭紒

HAR_THRESH=0.3NOD_AR_CONSEC_FRAMES=3hCOUNTER=0hTOTAL=0

鍚屾牱杩欓噷鎴戜滑涔熼渶瑕佽缃竴涓槇鍊煎拰璁℃暟鍣紒

reprojectdst,euler_angle=get_head_pose(shape)har=euler_angle[0,0]#

鍙杙itch鏃嬭浆瑙掑害ifhar>HAR_THRESH:#鐐瑰ご闃堝€?.3hCOUNTER+=1else:#濡傛灉杩炵画3娆¢兘灏忎簬闃堝€硷紝鍒欒〃绀虹瀸鐫$偣澶翠竴娆fhCOUNTER>=NOD_AR_CONSEC_FRAMES:#闃堝€硷細3hTOTAL+=1#閲嶇疆鐐瑰ご甯ц鏁板櫒hCOUNTER=0#缁樺埗姝f柟浣?2杞磃orstart,endinline_pairs:cv2.line(frame,(int(reprojectdst[start][0]),int(reprojectdst[start][1])),(int(reprojectdst[end][0]),int(reprojectdst[end][1])),(0,0,255))#鏄剧ず瑙掑害缁撴灉cv2.putText(frame,"X:"+"{:7.2f}".format(euler_angle[0,0]),(10,90),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,255,0),thickness=2)#GREENcv2.putText(frame,"Y:"+"{:7.2f}".format(euler_angle[1,0]),(150,90),cv2.FONT_HERSHEY_SIMPLEX,0.75,(255,0,0),thickness=2)#BLUEcv2.putText(frame,"Z:"+"{:7.2f}".format(euler_angle[2,0]),(300,90),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),thickness=2)#REDcv2.putText(frame,"Nod:{}".format(hTOTAL),(450,90),cv2.FONT_HERSHEY_SIMPLEX,0.7,(255,255,0),2)for(x,y)inshape:cv2.circle(frame,(x,y),1,(0,0,255),-1)ifTOTAL>=50ormTOTAL>=15:cv2.putText(frame,"SLEEP!!!",(100,200),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),3)

杩欓噷涔熸槸涓€浜涘垽鏂搷浣滃拰灏嗕俊鎭湪瑙嗛涓睍绀哄嚭鏉ャ€?

鏈€鍚庣殑鏁堟灉濡備笅锛?

馃専GUI鐣岄潰璁捐灞曠ず

骞朵笖鍙互瀹屾垚鎽勫儚澶存娴嬶紒

馃攷鏀寔锛氿煄侌煄侌煄佸鏋滆寰楀崥涓荤殑鏂囩珷杩樹笉閿欐垨鑰呮偍鐢ㄥ緱鍒扮殑璇濓紝鍙互鍏嶈垂鐨勫叧娉ㄤ竴涓嬪崥涓伙紝濡傛灉涓夎繛鏀惰棌鏀寔灏辨洿濂藉暒锛佽繖灏辨槸缁欎簣鎴戞渶澶х殑鏀寔锛?

相关推荐