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

从图像中读取条形码 - II

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (32投票s)

2005 年 6 月 20 日

CPOL

2分钟阅读

viewsIcon

346341

downloadIcon

24899

一个如何处理图像以提取条形码字符串的示例。

Sample Image

引言

我最近偶然发现了 Benjamin Liedblad 关于从图像中读取条形码字符串的文章。 代码很好,但在现实世界中不太有用。 我认为我的补充在这里有一席之地。

Berend Engelbrecht 已经极大地改进了这个项目。 他的新版本可以在 BarcodeImaging3.aspx 找到。

背景

Liedblad 的条形码读取器有两个明显的缺陷

  • 它只读取正面的条形码(正如他在“待办事项”中提到的那样)。
  • 它假设图像中除了条形码之外什么都没有。

通常,我们需要从包含其他文本的页面上读取条形码。 这就是我着手要做的事情。

Using the Code

首先,你应该查看原始文章,了解条形码读取的工作原理。 大部分代码都没有改变。

变更

  • 由于我们要查找的条形码可能不在我们扫描的文本行的开头,因此我们不能仅仅按 9 个“字符”的块进行扫描。 相反,我们一次沿着扫描的模式走一个“条”,测试它及其后面的 8 个条,看看它们是否构成一个字符。 如果我们找到一个真实的字符,那么我们就跳过字符模式并重新开始。
  • 由于许多页面上都有文本和其他干扰,我们需要将页面分成多个部分,并在每个部分中查找条形码。 我发现 50 是一个好的部分数。 虽然这看起来很多,但足以确保我们得到正在寻找的条形码。 您的结果可能会有所不同。 为此,我在 ReadCode39() 中添加了 startheightendheight。 然后我们只需要计算每个部分的开始和结束位置。 这可以在一个 for 循环中轻松完成
    for (int i=0; i < numscans; i++)
    {
        read = ReadCode39(bmp,i * (bmp.Height / numscans), 
               (i * (bmp.Height / numscans))+ (bmp.Height / numscans));
        [...]
    }
  • 我们需要检查所有四个页面方向,这可以通过 .NET 的 Bitmap 控件轻松处理
    for (int i=0; i < 4; i++)
    {
        bmp.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipNone);
        VScanPageCode39(ref CodesRead, bmp,numscans);
    }

    当然,如果您知道所有页面都是正面的,则可以不用使用此方法。

  • 最后,由于我们扫描了很多次并收到很多条形码(包括我们要查找的条形码的向后版本),我们需要存储所有找到的条形码。 为此,我决定使用 ArrayList。 该代码目前返回所有条形码,但由于大多数人为其代码提供某种模式(通常以星号“*”开头和结尾),因此很容易挑选出正确的条形码。

运行演示

当你运行演示并加载“SamplePage.jpg”时,首先执行“扫描条形码”。 这本质上与 Liedblad 的原始代码相同。 你会得到“*JR7”。 不是很帮助。 然后执行“扫描页面”。 现在你有一个条形码列表,其中一个是你要的那个 (*惊喜*)... 另一个是它的镜像 (P4 9V*VK P)。 正如你所看到的,很容易挑选出你需要的。

历史

  • 5-15-05:原创
  • 8-20-10:文章已更新
© . All rights reserved.