OpenCV+pyzxing实现条码解析

2022-06-13 11:11:17 浏览数 (1)

引子

Python中有几个开源的条码解析库,之前我测试过pyzbar、libdmx这些库,发现都是个锤子,主要是功能太弱了,解码能力堪忧,之前我用ZXING C 版本写过一很好用的条码跟二维码的解码库,于是我搜索一下看看是否有Python版本的ZXING,发现真有就是pyzxing,但是需要注意的是,它不是基于ZXing C 的,它是通过Python调用Java的依赖实现解码的,而且默认是支持hard模型跟旋转模式解码的。

pyzxing安装与测试

代码语言:javascript复制
https://pypi.org/project/pyzxing/

pyzxing在python下安装特别简单,只需要一条命令行执行:

代码语言:javascript复制
pip install pyzxing

但是它其实是依赖OpenJDK才能运行的,推荐最好安装1.8版本,下载地址如下:

代码语言:javascript复制
https://www.oracle.com/java/technologies/downloads/#jdk18-windows

安装好之后,cmd运行测试如下:

相关解码函数

相关功能与函数说明可以直接访问这个页面:

代码语言:javascript复制
https://pypi.org/project/pyzxing/

它支持三种输入

代码语言:javascript复制
-直接输入图像文件名,然后解码-使用opencv-python读取图像,输入numpy数据解码-使用目录通配符,支持一次多张解码操作

相关函数演示代码如下:

代码语言:javascript复制
from pyzxing import BarCodeReader
reader = BarCodeReader()results = reader.decode('/PATH/TO/FILE')# Or file pattern for multiple filesresults = reader.decode('/PATH/TO/FILES/*.png')print(results)# Or a numpy array# Requires additional installation of opencv# pip install opencv-pythonresults = reader.decode_array(img)

OpenCV-Python解码开发演示

在实际使用ZXING的解码中,首先需要做的就是各种图像预处理,因为多数工业喷码的图像质量都很一般,直接ZXING解码一次成功率大概只有50%左右,都需要通过各种预处理之后输入到ZXING二次解码,二次解码成功率会提升到95%左右,这个时候需要针对那些特别难的码进行更深度的预处理跟重新裁剪然后三次解码,总的三次解码成功率可以达到99%左右。这个里面涉及特别多解码细节问题。这里以最简单的几个工业常见的DataMatrix码的解码为例说明:

代码语言:javascript复制
from pyzxing import BarCodeReader
import cv2
import os

code_roi = cv2.imread(os.path.join(test_dir, f), cv2.IMREAD_GRAYSCALE)
cv2.bitwise_not(code_roi, code_roi)
ret, binary = cv2.threshold(code_roi, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
binary = cv2.erode(binary, se)
results = reader.decode_array(binary)
found = False
for result in results:
    code_txt = result.get('parsed')
    if code_txt is not None:
        print("decode content: ", code_txt)
        print("code type: ", result.get('format'))
        found = True

解码输出

0 人点赞