📜  人体姿态估计opencv (1)

📅  最后修改于: 2023-12-03 15:21:44.956000             🧑  作者: Mango

人体姿态估计 OpenCV

简介

人体姿态估计 (Human Pose Estimation) 是计算机视觉领域的一个重要任务,其目的是从图像或视频中预测人体的关节位置和姿态信息。OpenCV 是一个常用的开源计算机视觉库,其中也集成了许多人体姿态估计算法。

实现
1. 安装 OpenCV

在 Python 中使用 OpenCV,需要先安装 opencv-python 包:

pip install opencv-python
2. 加载模型

OpenCV 提供了一个 dnn 模块,可以用来加载支持 TensorFlow 的模型:

import cv2

model_path = 'pose_detection.pb'
net = cv2.dnn.readNetFromTensorflow(model_path)

其中,model_path 是模型文件的路径,可以从 OpenPose 官网 下载。readNetFromTensorflow 方法会读取模型文件,并返回一个 dnn_Net 对象。

3. 进行姿态估计

加载模型后,可以使用 dnn 模块提供的 blobFromImage 方法,将图片转换为模型可以处理的格式:

img = cv2.imread('image.jpg')

# 图片尺寸
height, width, channels = img.shape

# 转换 BGR 为 RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 转换为模型需要的格式
blob = cv2.dnn.blobFromImage(img, 1.0/255, (368, 368), (0, 0, 0), swapRB=False, crop=False)

其中,blobFromImage 方法的参数依次为:原始图片、归一化因子、目标图片大小、图片均值、是否交换 R、B 通道、是否要裁剪图片。

然后,可以使用 dnn 模块中的 setInput 方法,将 blob 作为输入,并通过 forward 方法,获取输出:

net.setInput(blob)
output = net.forward()

输出的 tensor 是一个 4 维数组,包含了多个 keypoints,可以使用 numpy 数组进行读取和处理:

num_people = output.shape[0]
num_keypoints = output.shape[1] // 3

keypoints = []
for i in range(num_people):
    person_keypoints = []
    for j in range(num_keypoints):
        index = i * num_keypoints * 3 + j * 3
        keypoints_x = int(output[0, index + 0] * width)
        keypoints_y = int(output[0, index + 1] * height)
        keypoints_confidence = output[0, index + 2]
        person_keypoints.append((keypoints_x, keypoints_y, keypoints_confidence))
    keypoints.append(person_keypoints)

其中,num_people 是检测到的人数,num_keypoints 是每个人的关键点数。

4. 可视化结果

最后,可以使用 OpenCV 提供的绘图 API,将 keypoints 绘制在原始图片上:

for person_keypoints in keypoints:
    for i, keypoints in enumerate(person_keypoints):
        if keypoints[2] > 0.1:
            cv2.circle(img, (keypoints[0], keypoints[1]), 3, (0, 255, 0), -1)

cv2.imshow("output", img)
cv2.waitKey(0)
总结

本文介绍了使用 OpenCV 进行人体姿态估计的方法。需要注意的是,OpenCV 的算法虽然有限,但是效果也非常不错,尤其适合用于实时姿态估计。如果需要更高精度的姿态估计,可以使用一些深度学习框架,如 PyTorch 和 TensorFlow,但这些方法需要更高的硬件和算法复杂度。