在对图片进行模板匹配后,我们需要直观地看到识别结果,以便于对代码继续优化。整体的流程如下:
diagnose()
├── 1. 加载模板
├── 2. 检查模板质量
├── 3. 读取截图
├── 4. 检测英雄框
├── 5. 对第一个英雄框做详细匹配分析
│ ├── 裁剪
│ ├── resize
│ ├── 灰度化
│ ├── 亮度归一化
│ ├── histogram 粗筛
│ └── NCC 精筛
└── 6. 输出诊断建议
1. INNER_MARGIN
mx = int(bw * INNER_MARGIN)作用:
去掉英雄框边缘。
因为边缘:有金边、星级、血条和UI装饰,这些会污染匹配。
2. resize
cv2.resize(crop, (TEMPLATE_SIZE, TEMPLATE_SIZE))统一尺寸,否则模板无法逐像素匹配。
3. 灰度化
crop_gray = cv2.cvtColor(...)模板匹配主要依赖:结构、轮廓和明暗关系,不是颜色,这样更鲁棒。
4. 亮度标准化(关键)
crop_gray = (crop_gray - g_min) / (g_max - g_min) * 255目的是消除:不同地图亮度、HDR、截图偏暗、OBS滤镜、夜间模式影响。NCC对亮度极其敏感。不标准化,亮度会产生较大偏差。
5. Histogram 粗筛
cv2.compareHist()快速缩小候选范围。
6. NCC 精筛(真正识别)
数学本质
ncc = dot(A,B) / (||A|| ||B||)即余弦相似度。
7. flatten
crop_flat = crop_gray.flatten()把二维图像(32*32)变成1024维向量。
8. 去均值
crop_flat - crop_gray.mean()消除整体亮度偏移。
9. 融合分数
fused = 0.4 * hist + 0.6 * ncc双特征融合。
10. MATCH_THRESHOLD
fused >= MATCH_THRESHOLD决定是否识别成功。