基于python语言编写使用openpose的人体骨骼点识别
时间: 2024-06-12 21:05:12 浏览: 254
视频+摄像头 使用 Python+OpenCV+OpenPose 实现人体形态算法识别
5星 · 资源好评率100%
OpenPose是一个开源的人体姿态估计库,它可以识别视频或图片中的人体骨骼点,包括头、肩、肘、手、脊椎、臀部、膝盖和脚等关键点。下面是一个基于Python语言编写使用OpenPose的人体骨骼点识别的例子:
首先,需要安装OpenCV和OpenPose。可以使用pip命令安装:
```
pip install opencv-python
pip install opencv-contrib-python
```
然后,下载并安装OpenPose。可以从官方网站或GitHub上下载。
接下来,使用OpenCV读取视频或图片文件,并将其传递给OpenPose进行人体骨骼点识别。代码如下:
```python
import cv2
import os
# 设置OpenPose路径和模型路径
openpose_path = "path/to/openpose"
model_path = os.path.join(openpose_path, "models")
# 加载OpenPose模型
net = cv2.dnn.readNetFromTensorflow(
os.path.join(model_path, "pose/coco/pose_iter_440000.caffemodel"),
os.path.join(model_path, "pose/coco/pose_deploy_linevec.prototxt")
)
# 加载图片或视频
img_path = "path/to/image_or_video"
cap = cv2.VideoCapture(img_path)
# 循环处理每一帧
while cap.isOpened():
# 读取一帧
ret, frame = cap.read()
# 如果读取失败,则退出循环
if not ret:
break
# 调整帧大小
frame = cv2.resize(frame, (640, 480))
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 进行人体骨骼点识别
net.setInput(cv2.dnn.blobFromImage(frame, 1.0/255, (368, 368), (0, 0, 0), swapRB=False, crop=False))
out = net.forward()
# 绘制人体骨骼点
points = []
for i in range(18):
# 获取关键点坐标
confidence_map = out[0, i, :, :]
_, confidence, _, point = cv2.minMaxLoc(confidence_map)
# 将坐标缩放到原始图像上
x = int((frame.shape[1] * point[0]) / out.shape[3])
y = int((frame.shape[0] * point[1]) / out.shape[2])
# 如果置信度不足,则忽略该点
if confidence > 0.1:
points.append((x, y))
# 绘制关键点连接线
for pair in [[1, 2], [2, 3], [3, 4], [1, 5], [5, 6], [6, 7], [1, 8], [8, 9], [9, 10], [10, 11], [8, 12], [12, 13], [13, 14], [1, 0], [0, 15], [15, 17], [0, 16], [16, 18]]:
p1 = points[pair[0]]
p2 = points[pair[1]]
cv2.line(frame, p1, p2, (0, 255, 0), 2)
# 显示图像
cv2.imshow("OpenPose", frame)
# 如果按下ESC键,则退出循环
if cv2.waitKey(1) == 27:
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
```
在上面的代码中,使用cv2.dnn.readNetFromTensorflow函数加载预训练的OpenPose模型。然后,读取图片或视频文件,并循环处理每一帧。对于每一帧,先将其调整大小并转换为灰度图像,然后使用cv2.dnn.blobFromImage函数将其转换为OpenCV DNN的输入格式,并传递给OpenPose进行人体骨骼点识别。最后,使用识别结果绘制每个人体的关键点和连接线,并在窗口中显示图像。
需要注意的是,上面的代码只能处理单个人体。如果要处理多个人体,则需要对每个人体进行单独的处理。另外,由于OpenPose需要消耗大量计算资源,因此在处理视频时可能会出现卡顿的情况。可以尝试调整帧率或使用GPU加速来提高性能。
阅读全文