姿势跟踪是检测和跟踪视频或图像中人体关节的任务。近年来,姿势跟踪因其在游戏、体育、医疗保健和机器人技术等各个领域的潜在应用而变得越来越流行。由于人体运动的复杂性和不同体型的变化,这是一项具有挑战性的任务。
该项目是关于使用 Python 中的 Mediapipe 库创建姿势跟踪应用程序。该应用程序将视频作为输入并检测视频中人物的身体姿势。然后使用检测到的身体姿势来跟踪各个身体部位的位置,例如手、脚和头。
Mediapipe 是由 Google 开发的开源库,用于为移动设备、桌面和 Web 浏览器构建实时、跨平台的应用程序。它为姿势估计、手部跟踪、人脸检测和对象跟踪等任务提供了一组预构建的模型和算法。在这个项目中,我们将使用 Mediapipe 库提供的姿势估计模型。
项目结构:
该项目包含一个 Python 脚本,该脚本使用 Mediapipe 库来检测视频中的身体姿势。该脚本分为两个类:“posetracking”类,其中包含检测姿势和跟踪位置的方法,以及“main”类,其中包含运行应用程序的主要方法。
“posetracking”类有两个方法:“findPose”和“findposition”。“findPose”方法将图像作为输入并使用 Mediapipe 姿态估计模型检测姿态。然后,该方法可视化图像上检测到的地标和片段,并返回处理后的图像。“findposition”方法将处理后的图像作为输入,并返回列表中身体部位的位置。
“main”方法使用 OpenCV 库读取视频文件并创建“posetracking”类的实例。然后,该方法使用“posetracking”类的“findPose”和“findposition”方法处理视频的每一帧。最后,该方法显示处理后的帧,其中包含检测到的身体部位和视频的帧速率。
用法:
要使用此应用程序,您需要安装以下库:
- 打开简历
- 媒体管道
您可以使用 pip 安装这些库:
pip install opencv-python
pip install mediapipe
安装库后,您可以通过在终端中执行以下命令来运行 Python 脚本:
python pose_tracking.py
源代码:
import mediapipe as mp
import time # to track fps
class posetracking:
def __init__(self,static_image_mode = False,model_complexity = 1,smooth_landmarks = True,enable_segmentation = False,smooth_segmentation = True,min_detection_confidence = 0.5,min_tracking_confidence=0.4):
self.model_complexity = model_complexity
self.smooth_landmarks = smooth_landmarks
self.enable_segmentation = enable_segmentation
self.smooth_segmentation = smooth_segmentation
self.min_detection_confidence = min_detection_confidence
self.min_tracking_confidence = min_detection_confidence
self.mpPose = mp.solutions.pose # use to detect pose landmarks
self.pose = self.mpPose.Pose(self.model_complexity,self.smooth_landmarks,self.enable_segmentation,self.smooth_segmentation,self.min_tracking_confidence)
self.mpDraw = mp.solutions.drawing_utils # functions for visualizing the detected landmarks and segments on the image.
# finding pose
def findPose(self,img,draw=True):
self.RGBimg = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
self.result = self.pose.process(self.RGBimg)
if self.result.pose_landmarks:
# for poseLms in self.result.pose_landmarks:
self.mypose = self.mpDraw.draw_landmarks(img,self.result.pose_landmarks,self.mpPose.POSE_CONNECTIONS)
return img
# getting potions ========
def findposition(self, img, draw=True):
lst = []
if self.result.pose_landmarks:
for id,lm in enumerate(self.result.pose_landmarks.landmark):
h,w,c = img.shape
cx,cy = int(lm.x * w), int(lm.y * h)
lst.append([id,cx,cy])
cv2.circle(img,(cx,cy),5,(0,0,255),cv2.FILLED)
return lst
# --------------------------end class
#python main-----------
if __name__ == "__main__":
# some variables
cTime = 0
pTime = 0
cap = cv2.VideoCapture('v1.mp4')
# clas obj
detector = posetracking()
while True:
success,frame = cap.read()
if not success:
break
frame = detector.findPose(frame)
lst = detector.findposition(frame)
print(lst)
cTime = time.time()
fps = 1/(cTime - pTime)
pTime = cTime
cv2.putText(frame,str(int(fps)), (70, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)
cv2.imshow('video',frame)
if cv2.waitKey(20) & 0xFF == ord("d"):
break
说明
这是一个 Python 代码,它使用 Mediapipe 库来跟踪视频中的人体姿势。该类posetracking包含检测和可视化姿势界标和片段以及获取它们位置的方法。主要功能捕获视频并使用该类posetracking检测和绘制视频每一帧上的姿势标志和片段。它还显示带有 FPS(每秒帧数)计数器的帧。
这是代码的逐行解释:
- 导入必要的库
mediapipe和time. - 定义
posetracking类。
4-13。使用影响姿势检测和跟踪的各种参数初始化类。
15–19。Pose从库中实例化类mediapipe,该类用于检测姿势界标。
20-21。drawing_utils从库中实例化该类mediapipe,该类提供用于可视化图像上检测到的地标和片段的函数。
24-35。该findPose方法将图像作为输入并返回带有检测到的地标和绘制在其上的片段的相同图像。它首先将图像从 BGR 格式转换为 RGB 格式,这是该类使用的格式Pose。然后它使用类处理图像Pose并将结果存储在result属性中。如果检测到姿势界标,它会使用类draw_landmarks中的函数将它们绘制在图像上drawing_utils。最后,它返回图像。
38–50。该findposition方法将图像作为输入并返回每个检测到的姿势界标的位置列表。它首先检查是否在属性中检测到姿势界标result。如果是这样,它会遍历地标并计算它们相对于图像大小的位置。它将每个位置及其相应的地标 ID 存储在列表中。然后它使用该函数在输入图像上的每个地标位置绘制一个圆圈cv2.circle。最后,它返回位置列表。
54-65。该main函数捕获视频并显示每个帧,其中绘制了检测到的地标和片段,以及 FPS 计数器。它首先使用该函数初始化一个视频捕获对象cv2.VideoCapture。然后它将posetracking类实例化为detector. 它进入一个循环,使用该方法从视频中读取帧cap.read()。如果成功读取一帧,它会将其传递给对象findPose的方法detector,以检测并在图像上绘制姿势界标和片段。然后它将生成的图像传递给对象findposition的方法detector以获取地标的位置。它将地标位置列表打印到控制台。它使用以下方法计算并显示视频的 FPStime图书馆。然后它使用该函数显示带有地标和 FPS 计数器的图像cv2.imshow。最后,如果按下“d”键,它会退出循环。
结论:
在这个项目中,我们使用 Python 中的 Mediapipe 库创建了一个姿势跟踪应用程序。该应用程序将视频作为输入并检测视频中人物的身体姿势。然后使用检测到的身体姿势来跟踪各个身体部位的位置。该项目可以扩展以包括其他功能,例如手势识别、姿势校正和运动跟踪。