Не могу прочитать QR-код с камеры - PullRequest
3 голосов
/ 17 октября 2011

EDIT:

Поработав с ним несколько часов, я пришел к выводу, что проблема заключается в качестве изображения. Например, к первому изображению относится то, как оно пришло с камеры. Декодер не может прочитать это. Второе изображение преобразуется в черно-белый с отрегулированным контрастом, и декодер отлично его читает.

Поскольку демонстрационное приложение, поставляемое с 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 ]

3 голосов
/ 18 октября 2011

Я написал этот код. Возвращение быстро не проблема. На мобильном устройстве очень быстрое декодирование и на настольном компьютере очень и очень быстрое.

Общий ответ на этот вопрос заключается в том, что некоторые изображения просто не будут декодироваться. Это жизнь - эвристика не всегда понимает это правильно. Но я не думаю, что здесь проблема.

QR-коды не декодируются без минимальной белой "тихой зоны" вокруг них. Изображение за его пределами считается белым для этой цели. Но в вашем сыром изображении с камеры вокруг кода есть небольшая граница, и он не все считает белым для бинаризатора, я бы поспорил.

Тем не менее, есть еще кое-что, что вы можете сделать. Например, установите подсказку TRY_HARDER для декодера, чтобы он потратил гораздо больше ресурсов процессора, чтобы попытаться декодировать. Вы также можете попробовать другую реализацию Binarizer, отличную от HybridBinarizer по умолчанию.

(Остальное выглядит просто отлично. Я предполагаю, что RGBLuminanceSource получает данные в ожидаемом формате; это должно быть с Bitmap)

0 голосов
/ 17 октября 2011

См. Это: http://zxing.org/w/docs/javadoc/com/google/zxing/NotFoundException.html Исключение означает, что штрих-код не был найден на изображении. Мое предложение будет использовать вашу работу, которая работает вместо того, чтобы пытаться декодировать необрезанное изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...