深入了解 Dynamsoft 条形码 SDK:揭示算法中间结果
在本文中,我们将通过 Python 和 C 代码向您展示如何获取 Dynamsoft 条码阅读器 SDK 的中间结果。
Dynamsoft 条码阅读器作为一款企业级条码解码 SDK,在最新的 **7.x 系列版本**中开放了一套全新的 API,允许开发者查看算法的中间结果。对于专业开发者而言,中间结果不仅有助于了解 SDK 的工作原理,还能在处理某些不利情况(如光线不足、运动物体等)时调试程序,并且还可以用于进一步的图像处理等用途。
在本文中,我们将通过 Python 和 C 代码向您展示如何获取 Dynamsoft 条码阅读器 SDK 的中间结果。
关于 Dynamsoft 条码阅读器
Dynamsoft 的 条码阅读器 SDK 让您只需几行代码即可在 Web、桌面或移动应用程序中高效地嵌入条码读取功能,从而节省开发时间和成本。有了该 SDK,您可以创建高速可靠的条码扫描仪软件,满足您的业务需求。
许可证
获取 免费 30 天试用许可证。
支持的条码符号体系
线性条码 (1D):Code 39、Code 93、Code 128、Codabar、Interleaved 2 of 5、EAN-8、EAN-13、UPC-A、UPC-E、Industrial 2 of 5。
2D 条码:QR Code、DataMatrix、PDF417 和 Aztec Code。
开发者指南
https://www.dynamsoft.com/help/Barcode-Reader/devguide/index.html
API 文档
https://www.dynamsoft.com/help/Barcode-Reader/index.html
代码库
https://www.dynamsoft.com/Downloads/Dynamic-Barcode-Reader-Sample-Download.aspx
在线演示
https://demo.dynamsoft.com/DBR/BarcodeReaderDemo.aspx
剖析 Dynamsoft 条码算法的中间结果
中间结果类型
支持的 中间结果类型 包括:
IRT_NO_RESULT |
无中间结果。 |
IRT_ORIGINAL_IMAGE |
原始图像。 |
IRT_COLOUR_CLUSTERED_IMAGE |
色彩聚类图像。 v8.x 版本可用。 |
IRT_COLOUR_CONVERTED_GRAYSCALE_IMAGE |
颜色转换的灰度图像。 |
IRT_TRANSFORMED_GRAYSCALE_IMAGE |
转换后的灰度图像。 |
IRT_PREDETECTED_REGION |
预检测区域。 |
IRT_PREPROCESSED_IMAGE |
预处理后的图像。 |
IRT_BINARIZED_IMAGE |
二值化图像。 |
IRT_TEXT_ZONE |
文本区域。 |
IRT_CONTOUR |
轮廓。 |
IRT_LINE_SEGMENT |
线段。 |
IRT_FORM |
表单。 v8.x 版本可用。 |
IRT_SEGMENTATION_BLOCK |
分割块。 v8.x 版本可用。 |
IRT_TYPED_BARCODE_ZONE |
类型化的条码区域。 |
JSON 模板使用
要导出预期的中间结果,请按如下方式配置 参数 JSON 模板:
"IntermediateResultSavingMode" : { "FolderPath" : "d:\\", "Mode" : "IRSM_BOTH" }, "IntermediateResultTypes" : [ "IRT_ORIGINAL_IMAGE", "IRT_COLOUR_CLUSTERED_IMAGE", "IRT_COLOUR_CONVERTED_GRAYSCALE_IMAGE", "IRT_BINARIZED_IMAGE" ],
注意:“IntermediateResultSavingMode
”键是设置输出目录所必需的。
如何在 C 代码中设置中间结果类型
有一个 DBR_InitRuntimeSettingsWithString()
函数用于加载全局配置的 JSON 模板。
DBR_InitRuntimeSettingsWithString()
DBR_API int DBR_InitRuntimeSettingsWithString | ( | void * | barcodeReader, |
const char * | content, | ||
const ConflictMode | conflictMode, | ||
char | errorMsgBuffer[], | ||
const int | errorMsgBufferLen | ||
) |
使用 JSON 字符串中的参数初始化运行时设置。
参数
[输入] | barcodeReader |
条码阅读器实例的句柄。 |
[输入] | content |
表示设置内容的 JSON 字符串。 |
[输入] | conflictMode |
参数设置模式,决定是继承先前模板设置的参数还是用新模板覆盖之前的设置。 |
[in,out] | errorMsgBuffer |
缓冲区由调用者分配,建议长度为 256。错误消息将复制到缓冲区。 |
[输入] | errorMsgBufferLen |
已分配缓冲区的长度。 |
Returns
返回错误代码。如果函数运行成功,则返回 0。您可以调用 DBR_GetErrorString() 获取详细的错误消息。
代码片段
void* barcodeReader = DBR_CreateInstance(); DBR_InitLicense(barcodeReader, "t0260NwAAAHV***************"); char errorMessage[256]; DBR_InitRuntimeSettingsWithString(barcodeReader, "{\"Version\":\"3.0\", \"ImageParameter\":{\"Name\":\"IP1\", \"IntermediateResultSavingMode\": { \"Mode\": \"IRSM_BOTH\",\"FolderPath\": \"d:\\IR\"},\"TerminatePhase\": \"TP_BARCODE_RECOGNIZED\", \"IntermediateResultTypes\": [\"IRT_BINARIZED_IMAGE\"],},}}", CM_OVERWRITE, errorMessage, 256); DBR_DestroyInstance(barcodeReader);
如何使用 Python 读取带中间结果的条码
构建 C 扩展
安装 Dynamsoft 条码阅读器 以获取头文件和共享库。
安装构建依赖项
pip install opencv-python numpy
在 dbr.c 文件中创建一个名为 setParameters()
的 CPython
方法
static PyObject * setParameters(PyObject *obj, PyObject *args) { DynamsoftBarcodeReader *self = (DynamsoftBarcodeReader *)obj; char *json; if (!PyArg_ParseTuple(args, "s", &json)) { return NULL; } char errorMessage[256]; int ret = DBR_InitRuntimeSettingsWithString(self->hBarcode, json, CM_OVERWRITE, errorMessage, 256); return Py_BuildValue("i", ret); }
该方法以 JSON 字符串作为输入。“DynamsoftBarcodeReader
”是代表 Python 条码模块的数据结构。
这是完整的代码
https://github.com/dynamsoft-dbr/python/blob/7.x/src/dbr.c
创建一个 setup.py 文件来构建 Python 扩展
from distutils.core import setup, Extension import sys import os import numpy from distutils.command.install import install # NumPy header file path. numpy_include = os.path.join(os.path.dirname( numpy.__file__), "core", "include", "numpy") print(numpy_include) # Customization for different platforms dbr_lib_dir = '' dbr_dll = '' dbr_include = '' dbr_lib_name = 'DynamsoftBarcodeReader' if sys.platform == "linux" or sys.platform == "linux2": # linux dbr_lib_dir = '/usr/lib' elif sys.platform == "darwin": # OS X dbr_lib_dir = '/usr/lib' pass elif sys.platform == "win32": # Windows dbr_lib_name = 'DBRx64' dbr_lib_dir = r'c:\Program Files (x86)\Dynamsoft\Barcode Reader 7.1\Components\C_C++\Lib' dbr_dll = r'c:\Program Files (x86)\Dynamsoft\Barcode Reader 7.1\Components\C_C++\Redist\x64' module_dbr = Extension('dbr', sources=['dbr.c'], include_dirs=[ numpy_include], library_dirs=[dbr_lib_dir], libraries=[dbr_lib_name]) class CustomInstall(install): def run(self): install.run(self) if sys.platform == "win32": import shutil from distutils.sysconfig import get_python_lib src = dbr_dll dst = get_python_lib() if os.path.isdir(src): lst = os.listdir(src) for f in lst: dll = os.path.join(src, f) shutil.copy2(dll, dst) else: shutil.copy2(src, dst) setup(name='dbr', version='7.1', description='Python barcode extension', author='Dynamsoft', author_email='support@dynamsoft.com', url='https://www.dynamsoft.com/Products/Dynamic-Barcode-Reader.aspx', license='https://www.dynamsoft.com/Products/barcode-reader-license-agreement.aspx', ext_modules=[module_dbr], long_description='Dynamsoft Barcode Reader is a software development toolkit which enables barcode recognition of Code 39, Code 129, QR Code, DataMatrix, PDF417 and Aztec.', platforms=['Windows', 'Linux', 'macOS'], cmdclass={'install': CustomInstall} )
对于 **Windows**,如果您更改了默认安装路径,则必须更新 dbr_lib_dir 和 dbr_dll。
dbr_lib_dir = r'c:\Program Files (x86)\Dynamsoft\Barcode Reader 7.1\Components\C_C++\Lib' dbr_dll = r'c:\Program Files (x86)\Dynamsoft\Barcode Reader 7.1\Components\C_C++\Redist\x64'
对于 **Linux** 和 **macOS**,将共享库复制到 /usr/lib 或其他 LD_LIBRARY_PATH。
dbr_lib_dir = '/usr/lib'
构建 Python 条码扩展
Python setup.py build install
一个简单的 Python 条码应用
创建一个 test.py 文件
import sys import cv2 import os import json from dbr import DynamsoftBarcodeReader dbr = DynamsoftBarcodeReader() def decodeFile(fileName, templateName=""): # 1D, PDF417, QRCODE, DataMatrix, Aztec Code barcodeTypes = 0x3FF | 0x2000000 | 0x4000000 | 0x8000000 | 0x10000000 results = dbr.decodeFile(fileName, barcodeTypes, templateName) for result in results: print("barcode format: " + result[0]) print("barcode value: " + result[1]) if __name__ == "__main__": print("OpenCV version: " + cv2.__version__) barcode_image = "" if sys.version_info < (3, 0): barcode_image = raw_input("Enter the barcode file: ") else: barcode_image = input("Enter the barcode file: ") if not os.path.isfile(barcode_image): print("It is not a valid file.") else: dbr.initLicense('LICENSE-KEY') # Set dbr parameters templateName = "dbr" settings = { "ImageParameter": {"name": templateName, "IntermediateResultSavingMode": { "Mode": "IRSM_BOTH", "FolderPath": "d:\\IR" }, "TerminatePhase": "TP_BARCODE_RECOGNIZED", "IntermediateResultTypes": [ "IRT_BINARIZED_IMAGE"], }, } params = json.dumps(settings) ret = dbr.setParameters(params) decodeFile(barcode_image, templateName)
获取 免费 30 天试用许可证 并更新代码
dbr.initLicense('LICENSE-KEY')
仔细检查输出目录是否存在
"FolderPath": "d:\\IR"
此处提供的代码片段显示了所需的中间结果是二值化图像。
"IntermediateResultTypes": ["IRT_BINARIZED_IMAGE"], },
运行应用
Python test.py
文件名以 ‘[ID*’ 开头的是运行条码解码算法的中间结果。
源代码
https://github.com/dynamsoft-dbr/python
即将推出?
Dynamsoft 计划未来提供更灵活的 API 和可自定义的参数。Dynamsoft 条码阅读器的秘密算法包括图像处理、条码定位和条码解码。开发者将被允许使用第三方图像处理库生成的图像作为输入。旨在最大化条码读取性能。
技术支持
如果您对 Dynamsoft 条码阅读器 SDK 有任何疑问,请随时联系 support@dynamsoft.com。
发布历史
v7.1, 2019/08/15
新内容
- 为视频帧解码添加了自动模糊帧过滤,减少了错误的条码识别。
- 为 ColourConversionModes 的 CICM_GENERAL 添加了三个参数来设置颜色转换的权重,通过使用不同权重的红、绿、蓝三色,为处理各种背景提供了更大的灵活性。
- 对于 C/C++ - 添加了一个新的结构体
FrameDecodingParameters
,添加了DBR_InitFrameDecodingParameters()
/InitFrameDecodingParameters()
方法,以及DBR_StartFrameDecodingEx()
/StartFrameDecodingEx()
方法,用于启动新线程解码条码。 - 对于 .NET - 添加了一个新的结构体
FrameDecodingParameters
,添加了InitFrameDecodingParameters()
和StartFrameDecodingEx()
方法,用于启动新线程解码条码。
已改进
- 通过向
PublicRuntimeSettings
结构体引入新参数intermediateResultSavingMode
,可以将中间结果的输出直接保存到文件夹、保存到内存或同时保存。
已修复
- 将 PDF 组件更新至 v10.3.2.0806
- 修复了 deblur 函数在某些罕见情况下可能出现故障的 bug。
- 修复了在某些情况下条码坐标可能计算不正确的 bug。
- 修复了
RequireStartStopChars
参数在某些罕见情况下可能出现故障的 bug。 - 修复了条码角度有时可能计算不正确的 bug。
- 修复了
GetIntermediateResults
抛出异常“值不能为空。\r\n参数名: destination”(针对 .NET 版本)的 bug。 - 修复了 Dynamsoft.Barcode.EnumBinarizationMode.BM_LOCAL_BLCOK 的拼写错误(针对 .NET 版本)。