【问题标题】:Can't read a QR code from camera无法从相机读取 QR 码
【发布时间】:2011-10-18 04:32:49
【问题描述】:

编辑:

玩了几个小时后,我开始相信问题出在图像质量上。例如,第一个图像是它来自相机的方式。解码器无法读取它。第二张图像经过调整后的对比度转换为黑白图像,解码器可以很好地读取它。

由于 zxing 附带的演示应用程序能够在几秒钟内从显示器读取第一张图像,我认为问题可能出在 zxing 库中的某些设置中。它没有等待足够长的时间来处理图像,但几乎立即吐出 NotFound。


我正在制作一个简单的二维码阅读器应用程序。这是一个屏幕截图。 顶部的黑色区域是表面视图,显示来自相机的帧。它工作正常,只是您在屏幕截图中看不到它。

然后,当我按下按钮时,从该表面视图中获取一个位图,放置在下面的 ImageView 上,并尝试由 zxing 库读取。

但它会发出 NotFoundException。 :/

**10-17 19:53:15.382: WARN/System.err(2238): com.google.zxing.NotFoundException
10-17 19:53:15.382: WARN/dalvikvm(2238): getStackTrace() called but no trace available**

另一方面,如果我从该屏幕截图中裁剪 qr 图像,将其放入 imageview(而不是相机源)并尝试对其进行解码,它可以正常工作。因此 QR 图像本身和它的质量都还可以......但是为什么它在第一种情况下不解码呢?

谢谢!

public void dec(View v)
{

ImageView ivCam2 = (ImageView)findViewById(R.id.imageView2);
ivCam2.setImageBitmap(bm);

BitmapDrawable drawable = (BitmapDrawable) ivCam2.getDrawable();
Bitmap bMap = drawable.getBitmap();

TextView textv = (TextView) findViewById(R.id.mytext);

LuminanceSource source = new RGBLuminanceSource(bMap); 
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Reader reader = new MultiFormatReader();
try {
     Result result = reader.decode(bitmap);
     Global.text = result.getText(); 
        byte[] rawBytes = result.getRawBytes(); 
        BarcodeFormat format = result.getBarcodeFormat(); 
        ResultPoint[] points = result.getResultPoints();
        textv.setText(Global.text);

} catch (NotFoundException e) {
    textv.setText("NotFoundException");
} catch (ChecksumException e) {
    textv.setText("ChecksumException");
} catch (FormatException e) {
    textv.setText("FormatException");
}  

}

位图是如何创建的:

    @Override
    public void surfaceCreated(SurfaceHolder holder) 
    {
            try
            {
                    this.camera = Camera.open();
                    this.camera.setPreviewDisplay(this.holder);

                    this.camera.setPreviewCallback(new PreviewCallback() {

                      public void onPreviewFrame(byte[] _data, Camera _camera) {

                        Camera.Parameters params = _camera.getParameters();
                           int w = params.getPreviewSize().width;
                           int h = params.getPreviewSize().height;
                           int format = params.getPreviewFormat();
                           YuvImage image = new YuvImage(_data, format, w, h, null);

                           ByteArrayOutputStream out = new ByteArrayOutputStream();
                           Rect area = new Rect(0, 0, w, h);
                           image.compressToJpeg(area, 50, out);

                           bm = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());

                      }
                    });

            }
            catch(IOException ioe)
            {
                    ioe.printStackTrace(System.out);
            }
    }

【问题讨论】:

  • 如何从 SurfaceView 获取位图?你在用SurfaceView.getDrawingCache()吗?
  • 不,见上文。 :) 但我认为位图没问题,因为它显示在 imageview 上。
  • 您能否将行 e.printStackTrace() 添加到 catch 语句中,以便我们查看问题所在?

标签: android zxing


【解决方案1】:

我写了这段代码。快速返回不是问题。在移动设备上解码速度非常快,在桌面设备上解码速度也非常快。

此类问题的一般答案是某些图像无法解码。这就是生活——启发式方法并不总是正确的。但我认为这不是问题所在。

QR 码周围没有最小的白色“安静区”就无法解码。为此,超出其边界的图像被视为白色。但是在您的原始相机图像中,代码周围几乎没有边框,而且我敢打赌,二值化器不会将其全部视为白色。

不过,您还可以做更多事情。为解码器设置 TRY_HARDER 提示,一方面,让它花费更多的 CPU 来尝试解码。您还可以尝试与默认 HybridBinarizer 不同的 Binarizer 实现。

(其余的看起来还不错。我假设RGBLuminanceSource 正在以它期望的格式获取数据;它应该来自Bitmap

【讨论】:

  • 感谢您的回答!请您解释一下,我应该把这个 TRY_HARDER 放在哪里以及如何尝试不同的 Binarizer 实现?再次感谢! :)
  • decode() 接受Hashtable 的提示。在该 arg 中将键 DecodeHintType.TRY_HARDER 设置为 Boolean.TRUE。你看到你在哪里使用HybridBinarizer了吗?尝试其他实现。
  • 谢谢...我已将其设置为 TryHarder,现在大约需要 2 秒,但仍然没有结果。 ://
  • 是的,但这不是我认为的问题。如上所述,您是否在图像周围留出了适当的空白?
  • 是的,我做到了,仍然没有。 :) 猜猜我必须像他们在damianflannery.wordpress.com/2011/06/13/… 所说的那样实施 ZXING,希望我能有所帮助。 :)
【解决方案2】:

请参阅:http://zxing.org/w/docs/javadoc/com/google/zxing/NotFoundException.html 异常表示在图像中未找到条形码。我的建议是使用您的解决方法,而不是尝试解码未裁剪的图像。

【讨论】:

  • 好吧,为了让它工作,我在 Photoshop 中手动裁剪了屏幕截图中的图像并将其输入解码器,只是为了让它工作并且确实工作。 (因此图像还可以)您是否建议我每次要扫描某些东西时都这样做? :P
  • 在您的描述中,您没有提到手动裁剪图像。我以为你是用软件裁剪的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
相关资源
最近更新 更多