以下是使用OpenCV和Matplotlib库实现的Openpose算法热点图和评价的Python代码:

import cv2
import matplotlib.pyplot as plt
import numpy as np

# 加载模型和配置文件
net = cv2.dnn.readNetFromTensorflow('pose/coco/pose_iter_440000.pb')
inWidth = 368
inHeight = 368
threshold = 0.1

# 定义身体关键点的连接关系
BODY_PARTS = {
    "Nose": 0,
    "Neck": 1,
    "RShoulder": 2,
    "RElbow": 3,
    "RWrist": 4,
    "LShoulder": 5,
    "LElbow": 6,
    "LWrist": 7,
    "RHip": 8,
    "RKnee": 9,
    "RAnkle": 10,
    "LHip": 11,
    "LKnee": 12,
    "LAnkle": 13,
    "REye": 14,
    "LEye": 15,
    "REar": 16,
    "LEar": 17,
    "Background": 18
}

# 定义身体关键点连接的顺序
POSE_PAIRS = [
    ["Neck", "RShoulder"],
    ["Neck", "LShoulder"],
    ["RShoulder", "RElbow"],
    ["RElbow", "RWrist"],
    ["LShoulder", "LElbow"],
    ["LElbow", "LWrist"],
    ["Neck", "RHip"],
    ["RHip", "RKnee"],
    ["RKnee", "RAnkle"],
    ["Neck", "LHip"],
    ["LHip", "LKnee"],
    ["LKnee", "LAnkle"],
    ["Nose", "REye"],
    ["REye", "REar"],
    ["Nose", "LEye"],
    ["LEye", "LEar"]
]

# 读取图像
image = cv2.imread('test.jpg')

# 对图像进行预处理
blob = cv2.dnn.blobFromImage(image, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False)

# 运行模型
net.setInput(blob)
out = net.forward()

# 获取关键点
points = []
for i in range(len(BODY_PARTS)):
    heatMap = out[0, i, :, :]
    _, conf, _, point = cv2.minMaxLoc(heatMap)
    x = int((image.shape[1] * point[0]) / out.shape[3])
    y = int((image.shape[0] * point[1]) / out.shape[2])
    if conf > threshold:
        points.append((x, y))
    else:
        points.append(None)

# 绘制关键点和连接线
for pair in POSE_PAIRS:
    partFrom = pair[0]
    partTo = pair[1]
    idFrom = BODY_PARTS[partFrom]
    idTo = BODY_PARTS[partTo]
    if points[idFrom] and points[idTo]:
        cv2.line(image, points[idFrom], points[idTo], (0, 255, 0), 3)
        cv2.circle(image, points[idFrom], 4, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)
        cv2.circle(image, points[idTo], 4, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)

# 显示图像
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()

# 计算关键点的热点图
h, w, c = image.shape
heatmap = np.zeros((h, w), dtype=np.float32)
for i in range(len(BODY_PARTS)):
    heatMap = out[0, i, :, :]
    heatmap += cv2.resize(heatMap, (w, h))
heatmap /= len(BODY_PARTS)

# 显示关键点的热点图
plt.imshow(heatmap, cmap='hot')
plt.show()

# 计算关键点的评价
score = 0
for pair in POSE_PAIRS:
    partFrom = pair[0]
    partTo = pair[1]
    idFrom = BODY_PARTS[partFrom]
    idTo = BODY_PARTS[partTo]
    if points[idFrom] and points[idTo]:
        dist = np.sqrt((points[idFrom][0] - points[idTo][0]) ** 2 + (points[idFrom][1] - points[idTo][1]) ** 2)
        score += dist
score /= len(POSE_PAIRS)
print('Score:', score)

需要先下载Openpose算法的模型文件和配置文件,将其保存在pose/coco目录下。将要测试的图像保存在当前目录下并命名为test.jpg。运行代码后会显示图像和关键点的热点图,并输出关键点的评价得分


原文地址: https://www.cveoy.top/t/topic/eRR9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录