📅  最后修改于: 2023-12-03 15:21:44.956000             🧑  作者: Mango
人体姿态估计 (Human Pose Estimation) 是计算机视觉领域的一个重要任务,其目的是从图像或视频中预测人体的关节位置和姿态信息。OpenCV 是一个常用的开源计算机视觉库,其中也集成了许多人体姿态估计算法。
在 Python 中使用 OpenCV,需要先安装 opencv-python 包:
pip install opencv-python
OpenCV 提供了一个 dnn
模块,可以用来加载支持 TensorFlow 的模型:
import cv2
model_path = 'pose_detection.pb'
net = cv2.dnn.readNetFromTensorflow(model_path)
其中,model_path
是模型文件的路径,可以从 OpenPose 官网 下载。readNetFromTensorflow
方法会读取模型文件,并返回一个 dnn_Net
对象。
加载模型后,可以使用 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
是每个人的关键点数。
最后,可以使用 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,但这些方法需要更高的硬件和算法复杂度。