做一个人群分析的代码,算法得到一个np.array的二维数组pred,存储了每个像素点的人数概率
1. 用这段代码可以直接根据pred画出热力图:
1 2 3 | import matplotlib.pyplot as plt plt.imshow(pred, cmap=plt.cm.jet) plt.show() |
2. 为了后续工作,需要用cv2来画。先上代码:
1 2 3 4 5 6 | import cv2 heatmapshow = None heatmapshow = cv2.normalize(pred, heatmapshow, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U) heatmapshow = cv2.applyColorMap(heatmapshow, cv2.COLORMAP_JET) cv2.imshow("Heatmap", heatmapshow) cv2.waitKey(50) |
3. 代码逻辑:
- pred本身是二维数组,可以看作一个单通道灰度图。
- pred的值都很小,而且是np.float64的浮点数,直接cv2.imshow出来的图就会是一片黑。
- plt.imshow内部其实是对pred做了归一化操作然后应用了色彩映射才能呈现热力图的效果。
- 所以在cv2中也需要做这两步才行:归一(cv2.normalize)和色彩映射(applyColorMap)
- plt.imshow里面的cmap参数和cv2.applyColorMap里面的cv2.COLORMAP_JET参数用于指定色彩。具体配色情况搜索关键词 <matplotlib cmap> 即可
这样就可以用opencv的cv2.imshow来画出与matplotlib中的plt.imshow一样效果的热力图。