在本教程中,我们将实现一个程序,帮助检测图像中的姿势,并将它们标记为图像上的地标。让我们首先了解什么是姿势检测。
姿势估计是一种计算机视觉方法,用于跟踪一个人或物体的运动。这通常是通过定位所提供物品的关键点来完成的。我们将使用mediapipe 库,这是一个跨平台的开源工具,用于创建多模型的机器学习管道。它能够实现最先进的模型,如人脸识别、多手跟踪、头发分割、物体检测和跟踪等等。

姿势检测演示
在Python中实现一个图像后置检测器
让我们首先把所有我们需要的必要的库导入到程序中。这些库包括OpenCV、mediapipe和matplotlib库。
import cv2
import mediapipe as mp
import matplotlib.pyplot as plt
第一步是初始化我们的姿势检测模型。同样是使用solutions.pose 函数进行初始化。
接下来,我们将使用Pose方法,即mp_pose.Pose ,以存储pose_image。该函数将接受一些参数。这些参数定义了我们是在图像上工作,它还设置了置信度分数。我们将为视频设置一个类似的Pose方法,并传递必要的参数值。
最后,我们将使用drawing_utils 函数在图像上绘制所有的姿势估计点。
请看下面的代码
mp_pose = mp.solutions.pose
pose_image = mp_pose.Pose(static_image_mode=True,
min_detection_confidence=0.5)
pose_video = mp_pose.Pose(static_image_mode=False,
min_detection_confidence=0.7,
min_tracking_confidence=0.7)
mp_drawing = mp.solutions.drawing_utils
下图所示的函数是主函数,它将在向函数取一些参数后估计姿势:
首先,我们将创建一个由用户提供的原始图像的副本,以便有一个安全的备份。接下来,我们将把图像转换为RGB形式,以使处理更容易。
下一步将是借助process ,在RGB转换后的图像上进行姿势检测。现在我们检查地标的验证,并决定是否需要画线和地标点。
def detectPose(image_pose, pose, draw=False, display=False):
original_image = image_pose.copy()
image_in_RGB = cv2.cvtColor(image_pose, cv2.COLOR_BGR2RGB)
resultant = pose.process(image_in_RGB)
if resultant.pose_landmarks and draw:
mp_drawing.draw_landmarks(image=original_image,
landmark_list=resultant.pose_landmarks,
connections=mp_pose.POSE_CONNECTIONS,
landmark_drawing_spec=mp_drawing.DrawingSpec(color=(255,255,255),
thickness=2, circle_radius=2),
connection_drawing_spec=mp_drawing.DrawingSpec(color=(49,125,237),
thickness=2, circle_radius=2))
if display:
plt.figure(figsize=[22,22])
plt.subplot(121);plt.imshow(image_pose[:,:,::-1])
plt.title("Input Image",size=14)
plt.axis('off');
plt.subplot(122);plt.imshow(original_image[:,:,::-1])
plt.title("Pose detected Image",size=14)
plt.axis('off');
else:
return original_image, resultant
最后,我们将对一些图像测试上述代码片断中的函数。其中一些的输出显示如下:
输出样本

姿势检测输出1

姿势检测输出2

姿势检测输出3
总结
你可以看到,结果非常令人高兴,我们可以肯定地说,Mediapipe在检测图像中的姿势方面做得很好。
谢谢您的阅读!