使用人工智能识别条码

7
作为一个宠物项目/学习经验(不是作业),我正在开发一款从照片中识别条形码的软件。我不是在寻找已有的软件或库,而是将其用作学习练习,并会在 CodePlex 上发布相关内容。 我已经编写了成功识别 EAN13 条形码的代码(发布在 CodePlex 上),UPC A / E 版本很快也会出现。然而,我有两个方面需要关注。首先是解码模糊或对比度差等问题的图片中的条形码。其次是在较大的图片中找到实际的条形码(现在必须提供只包含条形码的照片)。
我有一种直觉,认为某种形式的人工智能将帮助我解决这些问题。我过去曾经尝试过遗传算法,并且很久以前上过一门关于人工智能的课程,因此并不完全陌生,但我不确定该从哪里开始。
什么类型的算法最适合这种问题?有没有推荐的人工智能基础知识阅读材料或代码?是的,我想理解正在发生的事情,但我不一定想自己编写排序等代码。

3
也许是神经网络?我不知道。也许我只是喜欢神经网络。人工智能告诉我要喜欢它们。否则的话。 - fire.eagle
@ctacke:很抱歉,现在不行。我只是在大学图书馆里通过书籍学习了这个主题,而我至少还要等一周才能再次访问该图书馆。虽然我知道神经网络背后的理论,但我不知道足够多的内容来给出指针。我已经标记了这个问题;如果你下周仍在寻找,我会去看看能否从图书馆挖掘出这些书的标题。 - fire.eagle
@ctacke 我有了 - 它的表现非常出色。也许他们的SDK对你有所帮助:http://redlaser.com/SDK.aspx - Josh Stodola
你是否曾经实现过一个解决方案?另一个有趣的组件是仍然能够识别有效应用了某些仿射变换的条形码。 - Brooks
请看我的编辑,附有我离开的链接。 - ctacke
显示剩余4条评论
3个回答

9
我建议搜索条形码具有的属性。我想到的一些是:
  1. 颜色直方图显示大约均匀分布的两种不同颜色
  2. 进行霍夫变换可以找到许多平行线
  3. 线条的厚度具有两个明显的维度。

还有其他的吗?

有了这些,我会将图像分成几个部分,并使用这些特征进行分类,然后将结果组合起来计算碎片是否包含条形码的可能性。

对于您的第二个问题(模糊图像),我建议计算灰度值的一阶导数,然后在此空间中检测线条的边缘。如果图像模糊,则导数的最大值会降低,但应该能够检测到一定程度的模糊因素。

这对你有帮助吗?


4

正如mp已经指出的那样,您不需要任何真正的AI技术。查看Real World Haskell第12章,它实现了几乎完整的条形码识别器。示例代码是使用Haskell编写的,但有足够的解释,因此即使没有Haskell经验也可以理解思想和技巧。

如果您想要使用AI解决这个问题,那么最好的选择可能是使用ANNs。对于给定的问题,我建议使用一个相当先进的技术称为HyperNEAT。请参阅我的解释(和链接),作为Neural Network Size...SO问题的第一个答案。

我可能会使用两到三个不同的网络。

第一个任务是在大图上找到条形码。每个像素/像素组对应一个输出神经元,输出值是该像素是否可能为条形码的置信度。基于结果,我会使用一些图像转换将其转换为“标准”格式(x*y矩形)。
如果你在查找条形码位置时遇到困难,可以使用第二个任务。使用第一个任务的结果作为输入,并要求它给出两个角的坐标。然而,我不确定这个任务是否很容易进化。
最后一个任务将在标准格式上工作,每行(或方格,如果你处理可能的2D条形码)有输出神经元,表示给定区域应该被视为黑色还是白色。
可能还需要对图像进行一些预处理,例如RWH中描述的那些。

HyperNEAT听起来非常有趣。 - Matt Ellen
是的,这是一种非常强大的技术。研究相当深入,他们经常提出非常有创意的扩展/应用。 - Sandor Murakozi

0
你不需要任何特定的人工智能或软计算技术。你需要应用图像处理技术来改善图像质量或从较大的图像中隔离条形码。 你可以使用Matlab进行原型设计,并学习更多有关图像处理的知识。

什么样的“图像处理技术”?我这里也在编写代码。我有一张用手机拍摄的图片,我想得到一个字符串。就我所看到的,Matlab 在那个公式中并不是很适用。 - ctacke
Matlab是一个非常棒的图像处理工具,可以探索并找到适合您需求的解决方案。它有大量的滤波器和函数。现代计算机视觉的最新技术都集成在Matlab图像处理库中。一旦找到了最佳解决方案,您可以将其转换为您选择的编程语言和平台。我无法告诉您解决问题的最佳方法,您必须进行一些实验。 - mp.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接