无法从相机读取QR码

时间:2011-10-17 16:32:12

标签: android zxing

编辑:

在玩了几个小时之后,我开始相信问题在于图像质量。例如,第一张图像是它来自相机的方式。解码器无法读取它。第二个图像变成B / W,对比度调整,解码器读得很好。

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

enter image description here enter image description here


我正在制作一个简单的QR阅读器应用程序。这是一个截图。 顶部黑色区域是一个表面视图,显示来自摄像头的帧。它工作正常,只有你无法在截图中看到它。

然后,当我按下按钮时,会从该表面视图中获取一个位图,放在下面的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图像,将其放入图像视图(而不是相机输入)并尝试解码,它可以正常工作。因此,QR图像本身及其质量都可以......但是为什么不在第一种情况下解码呢?

谢谢!

enter image description here

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);
            }
    }

2 个答案:

答案 0 :(得分:3)

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

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

如果没有最小的白色“静区”,QR码就无法解码。为此目的,超出其边界的图像被视为白色。但是在您的原始相机图像中,代码周围的边界很小,而且二进制化器并不是全部都是白色的,我敢打赌。

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

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

答案 1 :(得分:-1)

请参阅:http://zxing.org/w/docs/javadoc/com/google/zxing/NotFoundException.html该例外表示图像中未找到条形码。我的建议是使用你的工作而不是尝试解码未裁剪的图像。