条码阅读器程序:条码识别方法

5

我是图像处理的新手,想要在图片中识别QR码。实际上有三个查找模式,首先需要找到它们。

所以我尝试了一些方法,第一个与二值化有关,但当图像有阴影和强烈的光照差异时,很难得到好的二值图像。实际上,自适应阈值取决于滑动窗口的大小,这对于大型条形码可能不太好。所以即使我得到了好的二值图像,你能否建议我找到条形码的查找模式和条形码本身的方法。如果我们谈论QR码,最简单的方法是找到图像的所有轮廓,并选择那些具有两个内部方形轮廓的正方形轮廓。

另一种方法是扫描图像的每条水平线以找到正确的查找模式,这取决于二值图像的质量。

因此我看到了解决这个问题的方法,但我想知道是否还有其他不同的方法来找到条形码的查找模式?我认为模式匹配在这里不太好用。你还能建议一个好的二值化方法,不依赖于光照。我尝试了许多自适应阈值二值化方法,但它们有共同的问题,如果图像包含一个大的黑色正方形,则二值图像将不是整个正方形,而是一个带有一些白色部分的正方形,在自适应阈值方法中滑动窗口的大小不够大。


有点重复,但我不确定。https://dev59.com/C0nSa4cB1Zd3GeqPRdfs - Stefano Borini
不完全是,我已经阅读了那个主题,他们正在讨论识别条形码的软件,但我想从零开始制作条形码阅读器程序,而不使用其他库。 - maximus
好的,也许有人可以告诉我任何自适应阈值二值化算法,使得它的窗口大小是动态选择的吗?例如:“只要像素邻域窗口大小设置正确,Bernsen算法就可以很好地工作。窗口应该适合图像中存在的对象的大小。只要能够预测对象的尺寸,并且所有对象几乎相等,这不是一个主要的缺点。”因此,在QRCode中有三个查找器模式,窗口大小必须大于该模式的大小。有人能谈谈这个问题吗? - maximus
2个回答

4
您可以查看ZXing使用的方法:http://code.google.com/p/zxing/source/browse/trunk,位于core/src/com/google/zxing/qrcode/Detector.java。
基本上,它在图像中寻找黑白相间的1:1:3:1:1模式。除非旋转角度接近45、135、225或315度,并且除非代码严重透视失真,否则此方法将找到查找器模式。然后,它进行了一些交叉检查——在图像中垂直查看该点以确认它也找到了这样的模式。它还有一些更多的检查来排除误报,并确定哪个模式是哪个。

1

您也可以尝试使用带有变化率控制的阈值滞后。这是普通阈值滞后的链接。将第一个阈值设置为典型的白色值。将第二个阈值设置为角落中最低白色值以下。

不同之处在于,您要检查第一个和第二个阈值之间所有值的像素差异。理想情况下,如果差异为正,则正常操作。但是如果它为负,则只有在差异很小的情况下才想进行阈值处理。

这将能够补偿照明变化,但将忽略背景和条形码之间的大变化。最终结果是二进制对象图像,而不是边缘图像。此外,没有自适应窗口来尝试正确调整大小。


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