65.9K
CodeProject 正在变化。 阅读更多。
Home

深入了解 Dynamsoft 条形码 SDK:揭示算法中间结果

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2019年9月20日

CPOL
viewsIcon

4267

在本文中,我们将通过 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_dirdbr_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 版本)。
© . All rights reserved.