飞道的博客

Opencv项目实战:18 人体姿态检测

515人阅读  评论(0)

目录

0、项目介绍

1、效果展示

2、项目搭建

3、项目代码讲解与介绍

 Basics.py

  PoseModule.py

Example.py

 人体姿态图​编辑

4、项目资源

5、项目总结


0、项目介绍

mediapipe中有人体姿态检测的功能,今天我们就将实现最最基础的人体姿态估计项目,它的应用还是有很多的,比如:AI锻炼检测标准、老人跌倒检测等,这些方面其实已经有了很多的参考资料了,当然在我知道的当中用yolo的倒是挺多的。那么今天我们将会通过人物跳舞的视频进行一个姿态的检测。

 

1、效果展示

可以看见GIF图片中人物跳舞视频检测到的人体姿态骨架。(窗口大小的问题,膝盖下的点没有检测到) 

2、项目搭建

如上图,你完全按这个模式照搬过去,完整的视频已经被我拆分好了,大家有兴趣的可以从我的GitHub中获得完整视频与拆分好的视频。

3、项目代码讲解与介绍

 Basics.py


  
  1. import cv2
  2. import mediapipe as mp
  3. import time
  4. mpDraw = mp.solutions.drawing_utils
  5. mpPose = mp.solutions.pose
  6. pose = mpPose.Pose()
  7. cap = cv2.VideoCapture( 'Pose_videos/02.mp4')
  8. pTime = 0
  9. while True:
  10. success, img = cap.read()
  11. imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  12. results = pose.process(imgRGB)
  13. # print(results.pose_landmarks)
  14. if results.pose_landmarks:
  15. mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)
  16. for id, lm in enumerate(results.pose_landmarks.landmark):
  17. h, w, c = img.shape
  18. print( id, lm)
  19. cx, cy = int(lm.x * w), int(lm.y * h)
  20. cv2.circle(img, (cx, cy), 5, ( 255, 0, 0), cv2.FILLED)
  21. #######################################################################################
  22. cTime = time.time()
  23. fps = 1 / (cTime - pTime)
  24. pTime = cTime
  25. cv2.putText(img, str( int(fps)), ( 70, 50), cv2.FONT_HERSHEY_PLAIN, 3,
  26. ( 255, 0, 0), 3)
  27. cv2.imshow( "Image", img)
  28. k=cv2.waitKey( 1)
  29. if k== 27:
  30. break

  PoseModule.py


  
  1. import cv2
  2. import mediapipe as mp
  3. import time
  4. class poseDetector():
  5. def __init__( self, mode=False, upBody=False, smooth=True,
  6. detectionCon=0.5, trackCon=0.5):
  7. self.mode = mode
  8. self.upBody = upBody
  9. self.smooth = smooth
  10. self.detectionCon = detectionCon
  11. self.trackCon=trackCon
  12. self.mpDraw = mp.solutions.drawing_utils
  13. self.mpPose = mp.solutions.pose
  14. self.pose = self.mpPose.Pose(self.mode, self.upBody, self.smooth)
  15. def findPose( self, img, draw=True):
  16. imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  17. self.results = self.pose.process(imgRGB)
  18. if self.results.pose_landmarks:
  19. if draw:
  20. self.mpDraw.draw_landmarks(img, self.results.pose_landmarks,
  21. self.mpPose.POSE_CONNECTIONS)
  22. return img
  23. def findPosition( self, img, draw=True):
  24. self.lmList = []
  25. if self.results.pose_landmarks:
  26. for id, lm in enumerate(self.results.pose_landmarks.landmark):
  27. h, w, c = img.shape
  28. # print(id, lm)
  29. cx, cy = int(lm.x * w), int(lm.y * h)
  30. self.lmList.append([ id, cx, cy])
  31. if draw:
  32. cv2.circle(img, (cx, cy), 5, ( 255, 0, 0), cv2.FILLED)
  33. return self.lmList
  34. def main():
  35. cap = cv2.VideoCapture( 'Pose_videos/02.mp4')
  36. pTime = 0
  37. detector = poseDetector()
  38. while True:
  39. success, img = cap.read()
  40. img = detector.findPose(img)
  41. lmList = detector.findPosition(img, draw= False)
  42. if len(lmList) != 0:
  43. print(lmList[ 14])
  44. cv2.circle(img, (lmList[ 14][ 1], lmList[ 14][ 2]), 15, ( 0, 0, 255), cv2.FILLED)
  45. cTime = time.time()
  46. fps = 1 / (cTime - pTime)
  47. pTime = cTime
  48. cv2.putText(img, str( int(fps)), ( 70, 50), cv2.FONT_HERSHEY_PLAIN, 3,
  49. ( 255, 0, 0), 3)
  50. cv2.imshow( "Image", img)
  51. k=cv2.waitKey( 1)
  52. if k== 27:
  53. break
  54. if __name__ == "__main__":
  55. main()

此模块参照与cvzone中的cvzone.PoseModule模块,大家以后也要学习一下这种制作模块的思想,对大家做项目时是很有帮助的。

Example.py


  
  1. import cv2
  2. import time
  3. import PoseModule as pm
  4. cap = cv2.VideoCapture( 'Pose_videos/02.mp4')
  5. pTime = 0
  6. detector = pm.poseDetector()
  7. while True:
  8. success, img = cap.read()
  9. img = detector.findPose(img)
  10. lmList = detector.findPosition(img, draw= False)
  11. if len(lmList) != 0:
  12. print(lmList[ 14])
  13. cv2.circle(img, (lmList[ 14][ 1], lmList[ 14][ 2]), 15, ( 0, 0, 255), cv2.FILLED)
  14. cTime = time.time()
  15. fps = 1 / (cTime - pTime)
  16. pTime = cTime
  17. cv2.putText(img, str( int(fps)), ( 70, 50), cv2.FONT_HERSHEY_PLAIN, 3,
  18. ( 255, 0, 0), 3)
  19. cv2.imshow( "Image", img)
  20. k = cv2.waitKey( 1)
  21. if k == 27:
  22. break

 可以看到,在以后做项目时就可以从模块当中copy代码,实现会变得更加的方便。

 人体姿态图

此为人体姿态各点的对应图,如果你想要检测某一点的信息,则需要查看此图。

(此图来源于Pose | mediapipe

4、项目资源

GitHub:18 Human Posture Recognition

5、项目总结

本次项目是按照mediapipe提供的人体姿态估计的功能实现的项目,非常的基础和简单,后面如果我有更好的点子会继续更新这部分内容。


转载:https://blog.csdn.net/m0_62919535/article/details/128425482
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场