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

引言
我最近偶然发现了 Benjamin Liedblad 关于从图像中读取条形码字符串的文章。 代码很好,但在现实世界中不太有用。 我认为我的补充在这里有一席之地。
Berend Engelbrecht 已经极大地改进了这个项目。 他的新版本可以在 BarcodeImaging3.aspx 找到。
背景
Liedblad 的条形码读取器有两个明显的缺陷
- 它只读取正面的条形码(正如他在“待办事项”中提到的那样)。
- 它假设图像中除了条形码之外什么都没有。
通常,我们需要从包含其他文本的页面上读取条形码。 这就是我着手要做的事情。
Using the Code
首先,你应该查看原始文章,了解条形码读取的工作原理。 大部分代码都没有改变。
变更
- 由于我们要查找的条形码可能不在我们扫描的文本行的开头,因此我们不能仅仅按 9 个“字符”的块进行扫描。 相反,我们一次沿着扫描的模式走一个“条”,测试它及其后面的 8 个条,看看它们是否构成一个字符。 如果我们找到一个真实的字符,那么我们就跳过字符模式并重新开始。
- 由于许多页面上都有文本和其他干扰,我们需要将页面分成多个部分,并在每个部分中查找条形码。 我发现 50 是一个好的部分数。 虽然这看起来很多,但足以确保我们得到正在寻找的条形码。 您的结果可能会有所不同。 为此,我在
ReadCode39()
中添加了startheight
和endheight
。 然后我们只需要计算每个部分的开始和结束位置。 这可以在一个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:文章已更新