人体关键点热力图npy
时间: 2025-02-02 09:38:08 浏览: 55
### 关于人体关键点热力图 `.npy` 文件处理的方法
#### 导入库
为了处理和操作`.npy`文件以及图像数据,需要导入必要的库:
```python
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image
import cv2
```
#### 读取原始图像并加载热力图数据
通过PIL库可以方便地打开JPEG格式的图像,并将其转换为NumPy数组形式。对于已经存储好的热力图数据,则可以直接利用`np.load()`函数来载入对应的`.npy`文件。
```python
img_f13 = np.array(Image.open('frames_Sitting 1.55011271.mp4_13.jpg'))
heatmaps_f13 = np.load("frames_13.jpg.npy")
```
#### 可视化单个Heatmap
如果想要单独查看某个特定的关键点所对应的热力图分布情况,可以通过指定索引来访问该位置上的二维矩阵,并使用Matplotlib绘制出来。
```python
def plot_single_heatmap(heatmap, title="Single Heatmap"):
plt.imshow(heatmap, cmap='hot', interpolation='nearest')
plt.title(title)
plt.colorbar()
plt.show()
plot_single_heatmap(heatmaps_f13[0], "Nose Heatmap") # 假设第一个通道代表鼻子部位
```
#### 将Heatmap与原图叠加显示
为了让效果更加直观,在实际应用中通常会将生成的人体姿态估计结果——即各个关键节点处产生的高斯响应图(Gaussian Response Map),也就是常说的热力图——同输入图片相结合起来展示给用户看。这里提供了一种简单的方式来进行这种融合操作。
```python
def overlay_heatmap_on_image(image, heatmap, alpha=0.6):
"""
:param image: 输入的基础RGB彩色图像 (H,W,C)
:param heatmap: 单一关键点的灰度热力图(H,W),范围应在[0,1]之间
:param alpha: 控制透明程度,默认值设置得较高以便更清晰看到热力区域
:return: 融合后的BGR格式OpenCV图像对象
"""
# 归一化到0~1区间内
heatmap_normalized = ((heatmap - heatmap.min()) / (heatmap.max() - heatmap.min()))
# 应用颜色映射表得到伪彩版本
colored_heatmap = cv2.applyColorMap(np.uint8(255 * heatmap_normalized), colormap=cv2.COLORMAP_JET)
# 图像尺寸匹配调整
if not all([image.shape[:2]==colored_heatmap.shape[:2]]):
resized_colormap = cv2.resize(colored_heatmap,(image.shape[1],image.shape[0]))
else:
resized_colormap = colored_heatmap
# 合成最终效果图
combined_img = cv2.addWeighted(src1=image[:, :, ::-1].copy(), alpha=alpha,
src2=resized_colormap, beta=(1-alpha),
gamma=0.)
return combined_img
overlay_result = overlay_heatmap_on_image(img_f13, heatmaps_f13[0])
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1); plt.imshow(img_f13); plt.axis('off'); plt.title('Original Image');
plt.subplot(1, 2, 2); plt.imshow(cv2.cvtColor(overlay_result.astype(np.uint8),cv2.COLOR_BGR2RGB)); plt.axis('off'); plt.title('Overlay Result');
plt.tight_layout(); plt.show();
```
上述代码实现了从读取.npz文件中的热力图数据到最后一步将这些热力图覆盖在源图像之上形成视觉上易于理解的结果的过程[^1]。
阅读全文
相关推荐

















