2

在不实现openCV或调用二维码识别API的情况下,有没有快速可靠的算法来确定图像中是否存在二维码?

这个问题的目的是改善扫描二维码的用户体验。当二维码识别失败时,程序需要知道是否真的存在二维码,以便再次扫描识别二维码,或者没有二维码,以便程序调用其他程序。

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

4

2 回答 2

2

很高兴您想向用户提供反馈。提供表明用户在查找 QR 码时“越来越热”的图形可以使查找和读取代码的过程更快、更顺畅。

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

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

如果您有图像金字塔的内存,那么使用降低分辨率的图像可能是有利的,因为您可以相当快地尝试许多测试。

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

于 2013-09-16T17:10:18.837 回答
1

1) 将图像转换为灰度 2) 将图像划分为 nxm 的单元格,例如 3 x 3。此过程旨在保证至少一个单元格将被可能的 QR 码完全覆盖(如果有) 3) 实现 2D 傅里叶变换所有的细胞。如果任何一个单元格的 X 轴和 Y 轴的高频区域的值都非常大,则很有可能存在 QR 码

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

于 2013-09-13T00:13:09.963 回答