用Python编程语言进行图像姿态检测的教程

370 阅读2分钟

在本教程中,我们将实现一个程序,帮助检测图像中的姿势,并将它们标记为图像上的地标。让我们首先了解什么是姿势检测。

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

Pose Detection Demo

姿势检测演示

在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

最后,我们将对一些图像测试上述代码片断中的函数。其中一些的输出显示如下:

输出样本

Pose Detection Output 1

姿势检测输出1

Pose Detection Output 2

姿势检测输出2

Pose Detection Output 3

姿势检测输出3

总结

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

谢谢您的阅读!