【问题标题】:Zxing NotFoundExceptionZxing NotFoundException
【发布时间】:2015-12-07 01:36:39
【问题描述】:

我尝试使用 Zxing 来解码 Aztec 代码。

我使用来自SO answer 的代码。 这是其中的一部分:

public static String readQRCode(String filePath, String charset, Map hintMap)
        throws FileNotFoundException, IOException, NotFoundException {
    BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
            new BufferedImageLuminanceSource(
                    ImageIO.read(new FileInputStream(filePath)))));
    Result qrCodeResult = new MultiFormatReader().decode(binaryBitmap,
            hintMap);
    return qrCodeResult.getText();
}

我尝试通过上面的代码读取这些图像:

但这失败了:

Exception in thread "main" com.google.zxing.NotFoundException

我说 - 好吧,也许质量太低了 - 所以我选择了 GIMP 并且:

  1. 使用 3x3 蒙版侵蚀图像。
  2. 采用自动 gimp 阈值处理(二值化图像)。

简单的预处理给了我这个:

也许它没有出色的质量,但它只是黑白 - 更好吗?不。我仍然获得:

Exception in thread "main" com.google.zxing.NotFoundException

奇怪的是:几乎所有条形码阅读器都可以毫无问题地读取两者。例如:NeoReader(Android - 手机)从笔记本电脑的屏幕读取两者 - 正确!

我想补充一点,像 this from Wiki 这样的绝对清晰的图像可以被这段代码正确识别。

问题:

上面的代码有什么问题?

如何解码这个阿兹特克代码?我可以进行任何预处理,但需要哪些步骤?

请帮忙。

项目详情:Java 8、com.google.zxing:core:3.2.1、com.google.zxing:javase:3.2.1

【问题讨论】:

    标签: java image-processing barcode zxing aztec-barcode


    【解决方案1】:

    请不要使用 jpg 文件,因为您会丢失一些重要信息。使用无损压缩文件格式,如 bmp 或 png。

    我仍然无法使用 zxing 读取此代码,但另一个网页:http://www.onlinebarcodereader.com/ 在我的预处理后读取它:

    1. 仅将图像裁剪为您的 aztec 代码:
    2. 创建统一的点数组(83 行和 83 列)并围绕每个点制作小圆圈(中心 = 计算点,半径 = 4):
    3. 创建大小为 83x83 的矩阵,并将每个矩阵单元的值设置为相应圆圈中的图像平均值。结果:
    4. 使用简单阈值处理(如果值

    我不知道为什么在线zxing阅读器不阅读这段代码(可能有很多错误,你应该改进一下上面的算法)。

    预处理非常简单,因此您可以使用任何开源图像处理库,例如开放式简历。 (我用的是 Adaptive Vision Studio(精简版应该够用了)。

    使用上面提到的在线阿兹台克阅读器我收到:

    mAMAAPZCAEEABr8yAjkAMX8KMAA1AP98AFAAUgBFAPtaAFkARA7 / TgBUACAATd8ALgpTAL5UD1f3blIavVoOV + 5OfFLXFklau0xeDndDAEFL3k8eQf06QQBMt38jd0kARH / fThpaAb1DHiDu / jBOwAauCi0K1gIzy43Oj9doLjY7SjQKwTFX2 + ZVALtHCpZ2VAB8A8GTrzZSWHtqRB73VgBGor8yljgASHueRn63AjcANnuX25lnBv93 / zgALW4rLfYDDg5TBV5LwQBPB3dG6rxOtlUdP6AeTO8CQRZJeypHSxseXi4qLvceLyKCLYvc89DaMfDnawc38 + 8wLjkMB247hjIHrw0AvQrXwSPXfyBSgjQ / Cqwwj7UaNe1uNSN9OQA3g0NhD70yN8Dv3SM4ADeDi7szNiZbLD8Wh2EXvU / uIO1HGkYPAjYHl7wyYjbokcNB1zYyw7hTO5ZNlsdDXt7TiiDhErx2GAF7ARjfMn8IVxsws3c1AkYvBje + NSNB8ANN6zPwBzj7izIj7zAT7TQAMANsOhJJJJJU / W ==中号 P>

    【讨论】:

    • 感谢您的回复。稍后我会尝试你的预处理想法。它不能解决整个问题,因为我仍然需要假设一些列/行号。但没关系,我想我可以处理它 - 在我的项目中,我什至可以简单地多次完成整个过程(例如表单值 80 - 85)。我非常感谢您的工作 - 谢谢。
    • 您的解决方案适用于 Zxing!至少对于上面的示例图像。 Online Zxing 只有在通过 URL 传递图像(不是文件 - 奇怪)后才能成功解码。这里是输出:zxing.org/w/decode?u=http%3A%2F%2Fi.stack.imgur.com%2FJ3Hj7.png 明天我会检查这个图像是否也被 Zxing Java 库解码。非常感谢。
    • 您能否稍微描述一下如何从第三步达到最终效果?
    • @ZZ5 在第三步中,我们有大小为 83x83px 的基于灰度的图像,因此您必须检查每个像素的灰度值是否小于 114(在此示例中,114 给出了很好的结果)。如果它小于最终矩阵,则放置黑色像素,否则放置白色像素。使用 google 阅读有关图像阈值的更多信息。
    • @ZZ5 不幸的是,我没有看到您的代码,所以无法帮助您。如果你想看我的解决方案,这里是(我改变了一点,根据我的帖子):onedrive.live.com/…。要打开文件 Program.avlite,您应该下载“Adaptive Vision Studio 4.3 Lite”。我认为它应该可以帮助您用任何其他语言(如 Java/c++)编写解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多