快速可靠的算法来确定图像中QR码的存在?

时间:2013-09-12 15:10:50

标签: algorithm computer-vision

如果没有实施openCV或调用QR码的识别API,是否有任何快速可靠的算法来确定图像中QR码的存在?

这个问题的目的是改善扫描QR码的用户体验。当QR码识别失败时,程序需要知道是否确实存在QR码才能扫描并再次识别QR码,或者没有任何QR码,以便程序可以调用其他程序。

为了回应某些响应,检测程序不需要100%准确,但以合理的概率返回准确的结果。如果我们可以在这里使用openCV,将很容易实现傅里叶变换来检测图像中是否存在明显的高频率,这是QR存在的良好信号。但openCV的集成将大大增加我的程序的大小,我想避免。

2 个答案:

答案 0 :(得分:2)

您希望向用户提供反馈非常棒。提供指示用户在查找QR码时“变暖”的图形可以使查找和读取代码的过程更快更顺畅。

看起来您已经有了答案,但为了提供更强大的解决方案和/或有选项,您可以尝试以下一项或多项:

  • 使用N次迭代来变暗关闭的暗像素,并且得到的方形棋盘图案应该更接近于填充的正方形。这是我用来确定DataMatrix(类似的2D代码)是否存在的检测方法的一部分,无论它是否可读。这是否有效将在很大程度上取决于您的背景。
  • 在应用FFT之前,考虑寻找仿射变换以减少透视失真。如果频率由于缩短而导致频率扩散,那么分析FFT数据可能会很痛苦。
  • 使用纹理测量(如局部二进制模式(LBP))或旧的技术(如Law的Texture方法)可以获得一些不错的结果。您甚至可能会很幸运,并且能够检测到2D代码和棋盘图案之间纹理度量直方图的细微差别。
  • 在类似棋盘状图案的区域中,查找QR码角落的3个引导功能。您可以尝试类似SIFT / SURF的方法,或者通过使用在比例空间中测试的有限数量的相关模板来实现更简单的匹配方法。
  • 说到比例空间:生成图像金字塔,以节省在全分辨率图像中搜索正方形的麻烦。您可以尝试使用边缘保留或非边缘保留方法在金字塔中生成较小的图像,或者两者的组合。
  • 如果您有快速内核处理的代码,您可以尝试使用角点检测方法来减少处理的数据量,以检测类似棋盘格的模式。
  • 寻找方形区域中灰度值的明显双峰分布。纸质标签上的二维码往往形成鲜明对比,即使纸张上的二维码在低对比度下也非常易读。
  • 您可以寻找渐变幅度非常一致,几乎是单峰的区域,而不是寻找灰度值的双峰分布。
  • 如果您知道可读QR码的最小/最大区域限制,您可以概率性地对图像中的一个或多个上述标准进行采样:一种梯度幅度模式,几乎均匀的空间角点等。如果一个补丁确实看起来很有希望,那么跳到另一个随机位置,但需要注意的是新补丁以前没有被发现没有希望。

如果你有图像金字塔的内存,那么使用降低分辨率的图像可能是有利的,因为你可以很快地尝试一些测试。

就用户交互而言,您可能还会在预处理过程中多次更新“这可能是QR码”图形,并指示逐渐更强/更绿的图形(或任何适合的颜色)的置信度当地文化)。例如,如果纹理块有大约60%的机会成为QR码,则可能会显示带有虚线边框的细黄绿色矩形。对于80%-90%的可能性,您可能会显示更饱和的绿色实心矩形。如果你可以每隔100到200毫秒更新一次图形,那么用户就会知道某些动作,例如移动智能手机有助于或伤害它。

答案 1 :(得分:1)

1)将图像转换为灰度 2)将图像分成n×m的单元,比如3×3。该程序旨在保证至少一个单元将被可能的QR码完全覆盖(如果有的话) 3)对所有单元实施2D傅里叶变换。如果在任何单元格中,X轴和Y轴的高频区域都有一个非常大的值,则存在QR码的可能性很高

我正在解决概率问题,而不是100%准确的检测。在该算法中,棋盘也将被检测为QR码。