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

伴随文本识别:通过 OCR 增强条形码扫描

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2020 年 1 月 16 日

CPOL
viewsIcon

7537

在本文中,我们将讨论如何使用开源 OCR 软件 Tesseract 从条码图像中识别伴随文本。

当使用线性条码(1D 条码)标记包裹、包装、产品和出版物时,相应的文本通常印在条码下方。条码是机器可读的,而伴随文本是人类可读的。如果条码损坏且无法识别,我们可以手动检查信息或利用 OCR(光学字符识别)技术作为自动条码扫描的辅助方法。

在本文中,我们将讨论如何使用开源 OCR 软件 Tesseract 从条码图像中识别伴随文本。此外,我们将演示如何使用 Dynamsoft Barcode Reader SDK 在复杂场景中获得更精确的结果。

使用 Tesseract OCR 识别伴随文本

当寻找免费的开源 OCR 引擎时,Tesseract 毫无疑问是首选,它最初由惠普开发,后来由 Google 开发和维护。

源代码可在 GitHub 上找到

https://github.com/tesseract-ocr/tesseract

访问 Wiki 页面 下载并安装预构建的二进制包。

安装完成后,您可以在命令行工具中运行“tesseract”命令。

看一下简单的场景。

运行以下命令

>tesseract accompanying-text.png output

>type output.txt

有时,结果包含一些错误识别的字符,这对于默认训练的数据来说是不可避免的。如果您想使其更精确,最好自己训练数据

您还可以将 Tesseract OCR 集成到 Python 程序中。安装 pytesseract - Tesseract OCR 引擎的包装器

pip install pytesseract

创建一个 test.py 文件

import argparse

try:
    from PIL import Image
except ImportError:
    import Image
import pytesseract

import sys

def main():
    # Get the input image file
    ap = argparse.ArgumentParser()
    ap.add_argument("-i", "--image", type=str,
        help="path to input image")
    args = vars(ap.parse_args())

    image = args["image"]
    if image == None:
        image = 'codabar.jpg'

    custom_oem_psm_config = r'digits'

    ## Invoke Tesseract OCR
    result = pytesseract.image_to_string(Image.open(image), config=custom_oem_psm_config)
    print(result)

if __name__ == "__main__":
    main()

上面的代码将仅输出数字

如果我们尝试更复杂的图像呢?

这是 Tesseract 的识别结果

在这种情况下,Tesseract 几乎无法用于辅助条码扫描。首先,结果不正确。其次,我们不知道哪个伴随文本属于哪个条码。

Dynamsoft Barcode Reader 提供的有效 OCR 辅助

在最新版本 7.3 中,Dynamsoft Barcode Reader 具有 OCR 功能,旨在提高条码扫描的准确性。

下载 Dynamsoft Barcode Reader v7.3

将示例代码 Dynamsoft\Barcode Reader 7.3\Samples\Desktop\C++\BarcodeReaderDemo 导入到 Visual Studio 中。

获取一个 免费试用许可证 并更新代码

reader.InitLicense("LICENSE-KEY");

启用识别伴随文本的模式

reader.GetRuntimeSettings(&runtimeSettings);
runtimeSettings.barcodeFormatIds = BF_ALL;
runtimeSettings.furtherModes.accompanyingTextRecognitionModes[0] = ATRM_GENERAL;
iRet = reader.UpdateRuntimeSettings(&runtimeSettings,szErrorMsg,256);

从条码结果中获取伴随文本

for (int iIndex = 0; iIndex < paryResult->resultsCount; iIndex++)
	{
		PExtendedResult* extResults = paryResult->results[iIndex]->results;
		unsigned char* accompanyingTextBytes = (*extResults)->accompanyingTextBytes;
		printf("Accompanying text: %s\n", accompanyingTextBytes);
}

按 F5 运行应用程序。

Dynamsoft Barcode Reader 可以正常工作。随着数据集的增长,文本识别率将在下一个版本中继续提高。

下一步是什么

Dynamsoft 条码开发团队正在开发价格标签 OCR,并将尽快发布第一个 Beta 版本。价格标签 OCR 可以将带有摄像头的机器人变成自动价格检查器,完全消除人为干预。机器人可以扫描杂货过道,同时捕捉价格标签的图像,读取条码以确定商品 SKU,并使用 OCR 将结构化定价信息返回以验证与数据库的价格是否一致。

技术支持

如果您对 Dynamsoft Barcode Reader SDK 有任何疑问,请随时联系 support@dynamsoft.com。

发布历史

v7.3,2020 年 1 月 2 日

新内容

  • 添加了一种新的条码类型邮政编码,包括 USPS Intelligent Mail、Postnet、Planet、澳大利亚邮政条码、RM4SCC。
  • 在结构体 PublicRuntimeSettings -> LocalizationModes 中添加了一种新的定位模式 LM_STATISTICS_POSTAL_CODE,用于识别邮政编码。
  • 增加了获取线性条码顶部或底部伴随文本的功能。可以通过打开结构体 PublicRuntimeSettings -> FurtherModes -> AccompanyingTextRecognitionModes 来启用此功能。
  • 实现了识别扭曲的 QR 码的功能。可以通过打开结构体 PublicRuntimeSettings -> FurtherModes -> DeformationResistingModes 来启用此功能。
  • 实现了补全 QR 码和 DataMatrix 条码缺失部分的功能。可以通过打开结构体 PublicRuntimeSettings -> FurtherModes -> BarcodeComplementModes 来启用此功能。
  • 添加了一个新设置 AutoFilter,用于设置是否在结构体 FrameDecodingParameters 中自动过滤帧。
  • 添加了一个新设置 ScaleUpModes,用于设置具有小模块大小的线性条码的放大模式。可以通过打开结构体 PublicRuntimeSettings -> ScaleUpModes 来启用此功能。

已改进

  • 改进了对安静区较窄的 DataMatrix 的解码精度。
  • 改进了对模块尺寸较小的 1D 条码的解码精度。
© . All rights reserved.