同一批素材里,清晰车牌能被框出来,夜间或远距离车牌框不出来,这通常不是单一开关的问题。更常见的判断路径是:识别对车牌在画面里的实际像素高度有下限,低于这个下限时,框选和识别会一起失效,无论怎么调参数都很难稳定。因此,更值得做的一件事是用同一张车牌构造几档清晰度版本,把画质设成唯一变量跑一遍,找出“开始框不住”的那一档,再看这一档对应多少像素高度。之后低于该像素高度的素材,改用手动处理,而不是继续反复调整识别阈值。
建议先用一张能稳定识别的原图,按分辨率或压缩质量生成几档递减版本,逐档记录是否框住、框选范围是否完整,并把失败档位换算成车牌的实际像素高度。如果失败档位的车牌像素高度明显偏低,说明问题主要来自素材本身的像素不足,不是配置漏项;这类素材改用固定区域或手动框选更快。画质较高但仍失败的素材,需要再检查角度、遮挡、反光和运动模糊,不能一概归为“画质问题”。
挑一张能识别出车牌的图,生成几档清晰度版本
先选一张已知能被正常框住的车牌图作为基准。这张图要满足几个条件:车牌完整在画面内、没有明显遮挡、不是极端角度、光照正常。基准图选好之后,只改变清晰度,其他条件(裁剪范围、车牌位置、色彩、文件名顺序)都保持不变,这样后面逐档对比时才有可比性。
可以用 ffmpeg 生成两组梯度,一组降低分辨率,一组降低 JPEG 压缩质量。下面命令里的输入输出路径按自己的目录替换,建议放在同一个测试目录下执行,文件名带上档位前缀,方便逐档查看:
# 基准图,确认能被识别
ffmpeg -i plate_clear.jpg -c copy plate_lv0.jpg
# 降低分辨率:宽度依次缩到 640 / 480 / 360 / 240
ffmpeg -i plate_clear.jpg -vf "scale=640:-2" -q:v 2 plate_lv1_w640.jpg
ffmpeg -i plate_clear.jpg -vf "scale=480:-2" -q:v 2 plate_lv2_w480.jpg
ffmpeg -i plate_clear.jpg -vf "scale=360:-2" -q:v 2 plate_lv3_w360.jpg
ffmpeg -i plate_clear.jpg -vf "scale=240:-2" -q:v 2 plate_lv4_w240.jpg
# 只降低压缩质量,分辨率保持原图
ffmpeg -i plate_clear.jpg -q:v 12 plate_q12.jpg
ffmpeg -i plate_clear.jpg -q:v 20 plate_q20.jpg
ffmpeg -i plate_clear.jpg -q:v 28 plate_q28.jpg
这里 scale 的宽度参数控制的是分辨率,-2 让高度按比例自动取偶数;-q:v 控制 JPEG 压缩质量,数值越大压缩越强、块效应越明显。两组要分开看:分辨率档位反映车牌占用的像素数变少,压缩档位反映边缘和笔画变糊。哪一组先失效,决定了后续该关注“车牌太小”还是“画面太糊”。
把这几档版本分别跑一遍,逐档记录车牌是否被框住
把生成好的图片按档位顺序送进打码鸭处理,一档一档看结果,不要批量跑完只看总数。每档至少记录四项:是否出现车牌框、框选范围是否覆盖完整车牌、有没有把非车牌区域误框进来、车牌文字是否可读。前两项决定识别是否可用,后两项决定结果能不能直接用于打码。
建议直接用下面的表结构记录,一档一行,失败档位在“是否框住”列填否,并在备注里写清是整块漏框还是只框到一部分:
档位 | 文件名 | 分辨率 | 是否框住 | 框选范围是否完整 | 备注
lv0 | plate_lv0.jpg | 原图 | 是 | 完整 | 基准
lv1 | plate_lv1_w640.jpg | 640宽 | | |
lv2 | plate_lv2_w480.jpg | 480宽 | | |
lv3 | plate_lv3_w360.jpg | 360宽 | | |
lv4 | plate_lv4_w240.jpg | 240宽 | | |
q12 | plate_q12.jpg | 原图 | | |
q20 | plate_q20.jpg | 原图 | | |
q28 | plate_q28.jpg | 原图 | | |
记录时注意区分两种失败:一种是完全不出框,另一种是出框但只盖住车牌的一部分。前者多半是特征已经不够,后者更可能是边界判断偏了,两种情况的处理方向不同。如果分辨率档和压缩档的失效位置差得很多,说明当前素材对分辨率更敏感或对压缩更敏感,后续按主导因素调整。
对照画面里车牌的实际像素高度,定位失败档位
只看“哪一档失败”还不够,要把失败档位换算成车牌在画面里的实际像素高度,这样下次遇到新素材可以直接估。测量方法很简单:用看图工具或画图软件打开该档图片,放大到能看清车牌上下边缘,从车牌字符上沿量到下沿,读出像素数。同一张图量两次取接近值,避免手抖误差。
把各档量到的像素高度填回记录表,失败档位对应的数值就是这次测试得到的参考下限。例如某档车牌高度只有二三十像素,字符笔画已经糊在一起,这一档识别不出属于正常现象,不需要再反复调整阈值。需要说明的是,这个下限与具体模型、车牌字体、拍摄角度都有关系,不同场景测出来的数值可能不同,应把这当成自己素材库的经验值,而不是通用标准。
如果某一档车牌像素高度看起来并不低,但仍然框不住,就要怀疑角度过斜、反光过强、字符被遮挡或运动拖影。这几类问题在像素足够时也可能导致失败,属于识别边界之外的干扰因素,测像素高度无法解释,需要单独看原图确认。
对低于该档位的素材改用固定区域或手动框选处理
确认某类素材的车牌像素高度低于测试得到的下限后,继续交给自动识别意义不大,改用固定区域或手动框选更稳妥。固定区域适合机位固定、车牌位置基本不变的素材,比如路口固定摄像头、停车场出入口;手动框选适合机位会动、车牌位置每帧不同的素材,比如手持拍摄或跟车视频。
固定区域的处理步骤:先在清晰帧上确定车牌所在的矩形范围,记下左上角坐标和宽高;在打码工具里新建固定区域,填入这组坐标;逐段抽几帧检查框是否仍覆盖车牌,机位有轻微偏移时微调坐标。手动框选的处理步骤:暂停到车牌清晰的一帧,拖框覆盖整个车牌并留一点余量;对车牌移动的片段按关键帧逐段补框;处理完成后回看一遍,确认没有漏框和多余遮挡。
两种方式的适用特征可以这样分:画面稳定、车牌位置重复出现,用固定区域,省时且一致;画面变化大、车牌位置不固定,用手动框选,准确但耗时。同一批素材里两种都可能出现,不必强求统一。
把这次测试记录留成清单便于下次复用
测试做完后,把档位、像素高度和最终处理方式整理成一页清单,放在素材目录旁边。下次遇到同类素材,先估车牌像素高度,对照清单直接决定走自动识别还是手动处理,不用每次重新试一遍。清单不需要很复杂,能查就行:
画质档位 | 车牌像素高度 | 默认处理方式 | 复核要求
清晰可用 | 高于经验下限 | 自动识别+人工抽查 | 抽查框选是否完整
临界档位 | 接近经验下限 | 自动识别后逐条确认 | 出现漏框立即转手动
低于下限 | 明显低于经验下限 | 固定区域或手动框选 | 回看全片确认无漏框
高像素仍失败 | 高于下限但不出框 | 检查角度/反光/遮挡后再定 | 记录失败原因备查
清单里的“经验下限”用自己测出来的数值填,不要照搬别人的数字。复核要求这一列是给后续处理留的把关动作:自动识别结果不能直接导出,抽几帧看一眼框选范围,能减少漏框返工。素材来源或拍摄条件变化较大时,建议重新做一次小规模梯度测试,更新清单里的档位划分。