085、二维码在复杂背景下识别失败?ZXing 定位增强 + 旋转校正 + 对比度拉伸方案
085、二维码在复杂背景下识别失败?ZXing 定位增强 + 旋转校正 + 对比度拉伸方案一、从一次产线翻车说起去年秋天,我接手一个工业读码项目——产线上二维码贴在金属反光表面,旁边还有油污和划痕。ZXing 在实验室跑得好好的,一上产线,识别率直接掉到 60%。最离谱的是,同一个二维码,换个角度拍就认不出来。拆开 ZXing 源码一看,定位模块对 Finder Pattern(定位图案)的检测依赖二值化后的连通域分析,一旦背景复杂、光照不均,Finder Pattern 的“黑白模块比例 1:1:3:1:1”就被破坏,定位直接崩掉。那段时间我盯着日志里“Could not find finder patterns”反复出现,差点想用 OpenCV 手写定位。后来冷静下来,决定不替换 ZXing,而是给它“打补丁”——在送入 ZXing 解码前,做三层预处理:定位增强、旋转校正、对比度拉伸。最终识别率稳定在 97% 以上。下面把踩过的坑和最终方案拆开讲。二、定位增强:别信 ZXing 的默认二值化ZXing 内部默认用 GlobalHistogramBinarizer 或 HybridBinarizer,前者对全局光照敏感,后者在局部对比度低时容易把 Finder Pattern 的黑色模块“吃”掉。我的做法是:先用 OpenCV 做自适应阈值,再手动校验 Finder Pattern 候选区域。