范畴特定言语(DSL)是一种针对特定类型问题的计算机言语。DSL的例子包括CSS、SQL、make等。

Martin Fowler对内部DSL和外部DSL进行了界说和区分。内部DSL是运用宿主言语的特别方式,能够让宿主言语具有特别的用法,比方 Jetpack Compose。外部DSL有自己的自界说语法,能够编写一个完好的解析器来处理它们,比方JSON和XML。

Dynamsoft Capture Vision是一个数据捕获结构,旨在轻松扫描文档、读取条形码和辨认文本。其主要特色之一是,咱们能够运用根据JSON的DSL来配置数据捕获使命。在本文中,咱们将介绍这个DSL。

不运用DSL和运用DSL

让咱们首要讨论下不运用DSL和运用DSL的用法。

假设咱们要扫描下图中的文档并读取条形码:

根据JSON的数据捕获用范畴特定言语

咱们能够运用Dynamsoft Document NormalizerDynamsoft Barcode Reader来履行此使命。这两个SDK支撑各种渠道,如iOS、Android、桌面和Web。这里,咱们运用Web的JavaScript版本:

let documentNormalizer = await Dynamsoft.DDN.DocumentNormalizer.createInstance(); //requires Dynamsoft Document Normalizer version 1.x
let barcodeReader = await Dynamsoft.DBR.BarcodeReader.createInstance(); //requires Dynamsoft Barcode Reader version 9.x
let img = document.getElementById("image");
let quads = await documentNormalizer.detectQuad(img);
let normalizedImageResult = await documentNormalizer.normalize(img, {
  quad: quads[0].location
});
let normalizedImageAsCanvas = normalizedImageResult.image.toCanvas();
let barcodeResults = await barcodeReader.decode(normalizedImageAsCanvas);

Dynamsoft Capture Vision能够作为一个中心程序调用Dynamsoft Document Normalizer和Dynamsoft Barcode Reader以得到相同的成果。

首要,咱们需求在JSON DSL中界说使命。

  1. 界说条形码读取使命和文档扫描使命。

    {
      "BarcodeReaderTaskSettingOptions": [
        {
          "Name": "task-read-barcodes"
        }
      ],
      "DocumentNormalizerTaskSettingOptions": [
        {
          "Name": "task-detect-and-normalize-document"
        }
      ]
    }
    
  2. 界说两个方针ROI :用于文档扫描的全图画ROI和根据检测到的文档图画的条形码读取ROI。

    {
      "TargetROIDefOptions": [
        {
          "Name": "roi-detect-and-normalize-document",
          "TaskSettingNameArray": ["task-detect-and-normalize-document"]
        },
        {
          "Name": "roi-read-barcodes",
          "TaskSettingNameArray": ["task-read-barcodes"],
          "Location":
          {
            "ReferenceObjectFilter" : {
              "ReferenceTargetROIDefNameArray": ["roi-detect-and-normalize-document"]
            }
          }
        }
      ]
    }
    

    留意:如果未设置Location,则ROI为整个图画。

  3. 界说一个名为ScanDocumentAndReadBarcode的模板,该模板运用上一步界说的两个方针ROI进行处理。

    {
      "CaptureVisionTemplates": [
        {
          "Name": "ScanDocumentAndReadBarcode",
          "ImageROIProcessingNameArray": [
            "roi-detect-and-normalize-document","roi-read-barcodes"
          ]
        }
      ]
    }
    

将JSON保存为template.json文件。然后,咱们能够运用以下JavaScript代码履行文档扫描和条形码读取使命:

let router = await Dynamsoft.CVR.CaptureVisionRouter.createInstance();
let response = await fetch("./template.json");
let settings = await response.text();
await router.initSettings(settings);
let results = await router.capture(document.getElementById("image"),"ScanDocumentAndReadBarcode");

咱们能够运用JSON DSL做更多的事情,例如设置图画处理参数,指定要运用的条形码格式等。能够在文档中了解相关信息。

PS:Dynamsoft Capture Vision需求Dynamsoft Document Normalizer v2 和Dynamsoft Barcode Reader v10 。

长处和缺陷

在Dynamsoft Capture Vision中运用根据JSON的DSL有一些长处和缺陷:

长处:

  • 数据捕获逻辑能够在不同渠道之间同享,无需编写特定于渠道的代码。
  • 图画处理成果能够在内部同享,以提高性能。例如,咱们不需求重复将图画读取为字节或将图画转换为灰度的操作。
  • 范畴专家能够比运用通用编程言语更有效地解决特定使命。

缺陷:

  • 有一个学习曲线。
  • 规划和保护DSL是一项额定成本。
  • 运用宿主言语修正设置并不容易。这在交互式场景中通常是必要的,例如在裁剪之前修正扫描文档的边界。

为了克服这些缺陷, Dynamsoft Capture Vision做了以下工作:

  1. 用于修正设置的编程接口: SimplifiedCaptureVisionSettings
  2. 帮助您学习的详细文档

源代码

能够在以下库房中找到Dynamsoft Capture Vision的demo代码:github.com/tony-xlh/dy…