如何基于HyperLPR实现车牌颜色识别 解决np.mean计算返回黑色问题
问题根因
你的代码存在3个核心错误,导致颜色识别全部匹配到黑色:
- 均值计算对象错误:你当前计算的是整张输入图像的通道均值,不是HyperLPR返回的车牌裁剪区域
rec的均值,整图包含大量无关背景,数值普遍偏暗自然会匹配到黑色。 - 颜色通道顺序不匹配:你预设的
COLORS是BGR格式,但调用closest_color时传入的是(红、绿、蓝)的RGB顺序,和COLORS的顺序完全相反,匹配逻辑直接错位。 - 预设标准颜色值偏差较大:你写的
COLORS数值和国内标准蓝、绿、黄车牌的实际BGR值偏差较大,也会提升误判概率。
修正后代码
首先执行安装命令:pip install hyperlpr
修正后的识别代码如下:
from hyperlpr import * import cv2 import numpy as np from math import sqrt # 调整为国内标准车牌对应的BGR颜色值 COLORS = [ (255, 0, 0), # 蓝色车牌 (0, 255, 0), # 绿色车牌 (0, 255, 255), # 黄色车牌 (0, 0, 0), # 黑色车牌 (255, 255, 255) # 白色车牌 ] # 颜色对应名称,方便输出 COLOR_NAMES = ["蓝色", "绿色", "黄色", "黑色", "白色"] def closest_color(bgr): b, g, r = bgr color_diffs = [] for color in COLORS: cb, cg, cr = color color_diff = sqrt(abs(b - cb)**2 + abs(g - cg)**2 + abs(r - cr)**2) color_diffs.append((color_diff, color)) return min(color_diffs)[1] image_list = [r"9.jpg","11.jpg"] for name in image_list: image = cv2.imread(name) result_green = HyperLPR_plate_recognition(image) if result_green: number = result_green[0][0] confidence = result_green[0][1] left,top,right,bottom = result_green[0][2] # 裁剪得到车牌区域 rec = image[top:bottom,left:right] cv2.imshow(name,rec) cv2.waitKey(0) # 计算车牌区域的BGR通道均值,不是整图的! b_mean = np.mean(rec[:,:,0]) g_mean = np.mean(rec[:,:,1]) r_mean = np.mean(rec[:,:,2]) print(f"车牌区域通道均值:B={b_mean:.2f}, G={g_mean:.2f}, R={r_mean:.2f}") # 传入BGR顺序的均值,和COLORS对应 index = COLORS.index(closest_color((b_mean, g_mean, r_mean))) print(f"车牌颜色:{COLOR_NAMES[index]},车牌号:{number},置信度:{confidence:.2f}")
优化建议
如果想要进一步提升光照变化下的识别准确率,可以把BGR格式转成HSV颜色空间做颜色匹配,HSV对亮度变化的鲁棒性远高于BGR,能大幅降低环境光带来的误判。
内容的提问来源于stack exchange,提问作者CR7
相关产品推荐
相关产品推荐

