3D人体骨架检测(mediapipe)


3D人体骨架检测(mediapipe)

使用python3中的mediapipe库进行实时3D骨架检测
pip install mediapipe
pip install opencv-python
pip install numpy
pip install vpython

  1. #coding=utf-8
  2. import cv2
  3. import mediapipe as mp
  4. from vpython import *
  5. #mediapipe 模型变量初始化
  6. def mediapipe_varibles_init():
  7. mp_pose = mp.solutions.pose
  8. pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1)
  9. mp_drawing = mp.solutions.drawing_utils
  10. return pose,mp_pose, mp_drawing
  11. #vpython(三维画图)模型变量初始化
  12. def vpython_variables_init():
  13. points = []
  14. boxs = []
  15. ids = [[12, 14, 16], [11, 13, 15], [12, 24, 26, 28, 30, 32, 28],
  16. [11, 23, 25, 27, 29, 31, 27], [12, 11], [24, 23]]
  17. c = []
  18. for x in range(33):
  19. points.append(sphere(radius=5, pos=vector(0, -50, 0)))
  20. c.append(curve(retain=2, radius=4))
  21. return points, boxs, ids, c
  22. #在3D里画出骨架的函数
  23. def draw_3d_pose():
  24. results = pose.process(cv2.cvtColor(f, cv2.COLOR_BGR2RGB))
  25. if results.pose_world_landmarks:
  26. for i in range(11, 33):
  27. if i != 18 and i!=20 and i!= 22 and i != 17 and i!=19 and i!=21:
  28. points[i].pos.x = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].x * -cap.get(3)
  29. points[i].pos.y = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].y * -cap.get(4)
  30. points[i].pos.z = results.pose_world_landmarks.landmark[mp_pose.PoseLandmark(i).value].z * -cap.get(3)
  31. for n in range(2):
  32. for i in range(2):
  33. c[i + 2 * n].append(vector(points[ids[n][i]].pos.x, points[ids[n][i]].pos.y, points[ids[n][i]].pos.z),
  34. vector(points[ids[n][i + 1]].pos.x, points[ids[n][i + 1]].pos.y,
  35. points[ids[n][i + 1]].pos.z), retaine=2)
  36. for n in range(2, 4):
  37. for i in range(6):
  38. c[i+6*n].append(vector(points[ids[n][i]].pos.x, points[ids[n][i]].pos.y, points[ids[n][i]].pos.z),
  39. vector(points[ids[n][i +1]].pos.x, points[ids[n][i + 1]].pos.y, points[ids[n][i+1]].pos.z), retaine = 2)
  40. for n in range(4, 6):
  41. for i in range(1):
  42. c[i+2*n].append(vector(points[ids[n][i]].pos.x, points[ids[n][i]].pos.y, points[ids[n][i]].pos.z),
  43. vector(points[ids[n][i +1]].pos.x, points[ids[n][i + 1]].pos.y, points[ids[n][i+1]].pos.z), retaine = 2)
  44. mp_drawing.draw_landmarks(image=f, landmark_list=results.pose_landmarks, connections=mp_pose.POSE_CONNECTIONS)
  45. #窗口关闭函数
  46. def clos_def():
  47. cap.release()
  48. cv2.destroyAllWindows()
  49. #获取变量
  50. points, boxs, ids, c = vpython_variables_init()
  51. pose, mp_pose, mp_drawing = mediapipe_varibles_init()
  52. #打开摄像头,0是第一个摄像头,如果想换一个摄像头请改变这个数字
  53. cap = cv2.VideoCapture(0)
  54. while True:
  55. #获取每一帧的图像
  56. _, f = cap.read()
  57. #vpython里的一个函数,用来调整3D中的FPS
  58. rate(150)
  59. #调用在3D里画出骨架的函数
  60. draw_3d_pose()
  61. #在每一帧里画骨架
  62. #显示每一帧
  63. cv2.imshow('real_time', f)
  64. #检测是否要关闭窗口
  65. if cv2.waitKey(1) & 0xFF == ord('q'):
  66. break
  67. #调用窗口关闭函数
  68. clos_def()

local 2023年4月11日 09:29 收藏文档