利用opencv+openpose實(shí)現(xiàn)人體姿態(tài)檢測,附詳細(xì)代碼。
通過一個偶然機(jī)會,我了解到了人體姿態(tài)解算,在學(xué)習(xí)K210之余,我便想著通過opencv實(shí)現(xiàn)這個功能,查找了很多資料,發(fā)現(xiàn)可以利用opencv+openpose實(shí)現(xiàn),接著我又開始找一些資料,在pycharm上部署。
前言
人體姿態(tài)估計(jì)的一個有趣應(yīng)用是 CGI(computer graphic image,一種電影制造技術(shù))應(yīng)用。如果可以檢測出人體姿態(tài),那么圖形、風(fēng)格、特效增強(qiáng)、設(shè)備和藝術(shù)造型等就可以被加載在人體上。
通過追蹤人體姿態(tài)的變化,渲染的圖形可以在人動的時候“自然”地與人“融合”。姿態(tài)估計(jì)的一個有趣應(yīng)用是在交互游戲中追蹤人體對象的運(yùn)動。
比較流行的 Kinect 使用 3D 姿態(tài)估計(jì)(采用 IR 傳感器數(shù)據(jù))來追蹤人類玩家的運(yùn)動,從而利用它來渲染虛擬人物的動作。
應(yīng)用:
用于檢測一個人是否摔倒或疾病
用于健身、體育和舞蹈等的自動教學(xué)
用于理解全身的肢體語言(如機(jī)場跑道信號、交警信號等)
用于增強(qiáng)安保和監(jiān)控
一、環(huán)境配置
pycharm2021.2.2
pycharm是一個很好用的軟件,剛開始我們必須要配置相應(yīng)的環(huán)境,當(dāng)然你使用我主頁里那篇模型訓(xùn)練的環(huán)境也可以,在你運(yùn)行的時候系統(tǒng)會提示你缺少了什么環(huán)境,并讓你安裝,你直接安裝即可。這里我就不過多的贅述了。
1.導(dǎo)入文件
在pycharm上導(dǎo)入相應(yīng)的文件后,你可以直接點(diǎn)擊運(yùn)行,系統(tǒng)會提示你缺少了什么環(huán)境,缺少什么就安裝什么,通過終端使用pip安裝即可。
2.具體代碼
#TouseInferenceEnginebackend,specifylocationofplugins: #exportLD_LIBRARY_PATH=/opt/intel/deeplearning_deploymenttoolkit/deployment_tools/external/mklml_lnx/lib:$LD_LIBRARY_PATH importcv2ascv importnumpyasnp importargparse parser=argparse.ArgumentParser() parser.add_argument('--input',help='Pathtoimageorvideo.Skiptocaptureframesfromcamera') parser.add_argument('--thr',default=0.2,type=float,help='Thresholdvalueforposepartsheatmap') parser.add_argument('--width',default=368,type=int,help='Resizeinputtospecificwidth.') parser.add_argument('--height',default=368,type=int,help='Resizeinputtospecificheight.') args=parser.parse_args() BODY_PARTS={"Nose":0,"Neck":1,"RShoulder":2,"RElbow":3,"RWrist":4, "LShoulder":5,"LElbow":6,"LWrist":7,"RHip":8,"RKnee":9, "RAnkle":10,"LHip":11,"LKnee":12,"LAnkle":13,"REye":14, "LEye":15,"REar":16,"LEar":17,"Background":18} POSE_PAIRS=[["Neck","RShoulder"],["Neck","LShoulder"],["RShoulder","RElbow"], ["RElbow","RWrist"],["LShoulder","LElbow"],["LElbow","LWrist"], ["Neck","RHip"],["RHip","RKnee"],["RKnee","RAnkle"],["Neck","LHip"], ["LHip","LKnee"],["LKnee","LAnkle"],["Neck","Nose"],["Nose","REye"], ["REye","REar"],["Nose","LEye"],["LEye","LEar"]] inWidth=args.width inHeight=args.height net=cv.dnn.readNetFromTensorflow("graph_opt.pb") cap=cv.VideoCapture(args.inputifargs.inputelse0) whilecv.waitKey(1)args.threlseNone) forpairinPOSE_PAIRS: partFrom=pair[0] partTo=pair[1] assert(partFrominBODY_PARTS) assert(partToinBODY_PARTS) idFrom=BODY_PARTS[partFrom] idTo=BODY_PARTS[partTo] ifpoints[idFrom]andpoints[idTo]: cv.line(frame,points[idFrom],points[idTo],(0,255,0),3) cv.ellipse(frame,points[idFrom],(3,3),0,0,360,(0,0,255),cv.FILLED) cv.ellipse(frame,points[idTo],(3,3),0,0,360,(0,0,255),cv.FILLED) t,_=net.getPerfProfile() freq=cv.getTickFrequency()/1000 cv.putText(frame,'%.2fms'%(t/freq),(10,20),cv.FONT_HERSHEY_SIMPLEX,0.5,(0,0,0)) cv.imshow('OpenPoseusingOpenCV',frame)
這里便是主函數(shù)的代碼。
3.效果展示
這副圖片便是識別的效果,幀率還是很不錯的。
三、效果優(yōu)化
這個幀率雖然可以,但是效果屬實(shí)有點(diǎn)拉跨。教我K210的學(xué)長便指導(dǎo)我進(jìn)行優(yōu)化改進(jìn),這里附上學(xué)長的連接(https://blog.csdn.net/hyayq8124spm=1001.2014.3001.5509)
1.具體代碼
importcv2 importtime importmediapipeasmp fromtqdmimporttqdm #導(dǎo)入solution mp_pose=mp.solutions.pose mp_drawing=mp.solutions.drawing_utils pose=mp_pose.Pose(static_image_mode=False, #model_complexity=1, smooth_landmarks=True, #enable_segmentation=True, min_detection_confidence=0.5, min_tracking_confidence=0.5) defprocess_frame(img): #BGR轉(zhuǎn)RGB img_RGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) results=pose.process(img_RGB) #可視化 mp_drawing.draw_landmarks(img,results.pose_landmarks,mp_pose.POSE_CONNECTIONS) #look_img(img) #mp_drawing.plot_landmarks(results.pose_world_landmarks,mp_pose.POSE_CONNECTIONS) ##BGR轉(zhuǎn)RGB #img_RGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) # #results=hands.process(img_RGB) #ifresults.multi_hand_landmarks:#如果有檢測到手 # #forhand_idxinrange(len(results.multi_hand_landmarks)): #hand_21=results.multi_hand_landmarks[hand_idx] #mpDraw.draw_landmarks(img,hand_21,mp_hands.HAND_CONNECTIONS) returnimg cap=cv2.VideoCapture(1) #打開cap cap.open(0) #無限循環(huán),直到break被觸發(fā) whilecap.isOpened(): #獲取畫面 success,frame=cap.read() ifnotsuccess: print('Error') break ##!!!處理幀函數(shù) frame=process_frame(frame) #展示處理后的三通道圖像 cv2.imshow('my_window',frame) ifcv2.waitKey(1)in[ord('q'),27]: break cap.release() cv2.destroyAllWindows()
2.效果展示
總結(jié)
到這里這篇文章就結(jié)束了,寫這篇博客只是單純記錄自己的學(xué)習(xí)過程。希望看到這篇博客的你,能夠更加堅(jiān)定的學(xué)習(xí)。胡適說過一句話我覺得特別好,這里分享給大家。
-
傳感器
+關(guān)注
關(guān)注
2565文章
52942瀏覽量
766968 -
3D
+關(guān)注
關(guān)注
9文章
2959瀏覽量
110698 -
OpenCV
+關(guān)注
關(guān)注
32文章
642瀏覽量
42844
原文標(biāo)題:實(shí)踐教程|通過Opencv+Openpose實(shí)現(xiàn)人體姿態(tài)檢測
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
【愛芯派 Pro 開發(fā)板試用體驗(yàn)】人體姿態(tài)估計(jì)模型部署前期準(zhǔn)備
基于openCV的人臉檢測系統(tǒng)的設(shè)計(jì)
如何利用MPU6050進(jìn)行姿態(tài)檢測
如何對基于RK3399的OPENPOSE進(jìn)行開發(fā)設(shè)計(jì)呢
人手姿態(tài)檢測系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

iNEMO模塊的姿態(tài)檢測設(shè)計(jì)方案

iNEMO模塊的特點(diǎn)及用其實(shí)現(xiàn)人體姿態(tài)檢測系統(tǒng)的設(shè)計(jì)

使用Adaboost算法實(shí)現(xiàn)車牌檢測在OpenCV上實(shí)現(xiàn)的研究分析

利用OpenCV構(gòu)建一個RaspberryPi運(yùn)動檢測系統(tǒng)

使用Vitis AI和Openpose處理數(shù)據(jù)以檢測跌倒檢測

100行Python實(shí)現(xiàn)人體膚色檢測
通過Opencv+Openpose實(shí)現(xiàn)體姿態(tài)檢測

AI深度相機(jī)-人體姿態(tài)估計(jì)應(yīng)用

利用OpenCV進(jìn)行顏色檢測

評論