You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:15:21