使用pylibdmtx解码Data Matrix丢失FNC1字符的问题咨询
解决pylibdmtx解码Data Matrix时丢失FNC1符号的问题
问题说明
尝试用pylibdmtx解码图片中的Data Matrix码时,无法获取包含完整符号的原始数据串。使用的代码如下:
import cv2 from pylibdmtx import pylibdmtx if __name__ == '__main__': image = cv2.imread("image path", cv2.IMREAD_UNCHANGED) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) msg = pylibdmtx.decode(thresh) print(msg)
当前得到的结果为:
b'0104607009780924215XstxH93zPte'
但该Data Matrix码实际应包含:
(FNC1)0104607009780924215XstxH(FNC1)93zPte
其中(FNC1)是不可打印符号,对应ASCII<232>。根据libdmtx更新日志,该库原生支持FNC1,推测问题出在Python封装或缺少必要的初始化配置,已参考相关Stack Overflow帖子但未解决。
解决建议
1. 配置pylibdmtx的解码flags参数
pylibdmtx的decode函数支持传递flags参数,对应libdmtx的原生解析标志。添加DmtxFlagFNC1标志可启用FNC1符号的解析与保留,修改后的代码如下:
import cv2 from pylibdmtx import pylibdmtx if __name__ == '__main__': image = cv2.imread("image path", cv2.IMREAD_UNCHANGED) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 启用FNC1符号解析 msg = pylibdmtx.decode(thresh, flags=pylibdmtx.DmtxFlagFNC1) print(msg)
2. 替换为pyzbar库解码
pyzbar是另一个稳定的条码解码库,对特殊控制字符的支持更可靠,示例代码:
import cv2 from pyzbar.pyzbar import decode if __name__ == '__main__': image = cv2.imread("image path") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 指定仅解码Data Matrix码 results = decode(gray, symbols=[decode.DataMatrix]) for result in results: print(result.data)
3. 直接调用libdmtx命令行工具
若Python封装问题无法解决,可直接使用libdmtx原生命令行工具dmtxread获取结果,命令如下:
dmtxread image_path.png
该方式绕过Python封装,直接获取libdmtx的原生解析结果,能确保保留FNC1符号。
内容的提问来源于stack exchange,提问作者Nikita Dvoretskii
相关产品推荐
相关产品推荐

