Как прочитать несколько qr-кодов с одного изображения с помощью библиотеки zxing

В настоящее время я разрабатываю сканер, который считывает несколько QR-кодов, найденных на одном изображении. Мне удается прочитать QR-коды на изображении, но это дает противоречивые результаты. Предполагая, что на изображении 4 QR-кода, иногда я могу прочитать 2, а иногда 3 или только 1. В отличие от оригинального сканера (ZXing Scanner), он быстро декодирует. В то время как в моем случае я должен убедиться, что света достаточно и изображение не размыто для его декодирования.

Я использую QRCodeMultiReader для декодирования изображения. В настоящее время для создания приложения используется ZXing библиотека.

Ниже приведен фрагмент моего кода:

public void onPictureTaken(byte[] data, Camera camera) {
   BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inMutable = true;
   Bitmap bitmap = BitmapFactory
            .decodeByteArray(data, 0, data.length, opt);
   Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
   hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
   LuminanceSource source = new RGBLuminanceSource(bitmap);

   QRCodeMultiReader multiReader = new QRCodeMultiReader();
   Result[] results = multiReader.decodeMultiple(new BinaryBitmap(
   new HybridBinarizer(source)), hints);
}

person She Smile GM    schedule 27.02.2013    source источник
comment
Вы нашли идеальное решение для чтения нескольких штрих-кодов?/   -  person Ando Masahashi    schedule 23.06.2014
comment
к сожалению, нет, потому что мы остановили разработку этой функции. Но я продолжу искать решение для этого, особенно потому, что я вернулся в Android.   -  person She Smile GM    schedule 24.06.2014
comment
Хорошо, можете ли вы поделиться со мной кодом, который вы пробовали раньше?   -  person Ando Masahashi    schedule 24.06.2014
comment
Я просто использовал библиотеку zxing и настроил свой код для камеры. Я только что следовал руководству по Android по настройке вида камеры в основном действии. У меня сейчас нет копии рабочего кода, так как я больше не связан с клиентом, который попросил меня сделать эту функцию. Я не храню коды, так как они уже принадлежат клиенту.   -  person She Smile GM    schedule 25.06.2014
comment
@SheSmileGM Пожалуйста, помогите мне, я ищу то же самое. Но в моем случае только один считанный QR-код подходит из всех, потому что все коды одинаковы. Пожалуйста, попробуйте дать мне ответ здесь: stackoverflow.com/questions/30767188/   -  person sam_k    schedule 12.06.2015
comment
Вы должны иметь возможность использовать метод getResultPoints() из доступных результатов, чтобы найти местоположение в исходном изображении совпадения и использовать его для удаления этой области изображения. Затем вы можете повторять шаги декодирования, пока не будет найдено больше результатов.   -  person Logan Pickup    schedule 01.08.2016


Ответы (2)


я создал одно приложение для камеры, которое я использовал intent, так как приложение камеры по умолчанию есть в каждой ОС Andriod, и, как правило, они лучше оптимизированы для этого устройства, чем писать общее приложение камеры, которое было бы оптимизировано только для вашего телефона... так что для камеру лучше использовать intent.

Для извлечения нескольких QR из одного изображения я попробовал код ниже.
Но результаты иногда не совпадают, иногда я получаю 1, 2 или 3 из 4, иногда нет... это не идеальное решение.

if(photo == null) 
        return;
    Bitmap ScaledQr = null;
    ScaledQr = Bitmap.createScaledBitmap(photo, 640,480, false);
    BinaryBitmap Qr = BitMap2BinayBitmap(ScaledQr);
    Result [] kpResultMulti = null;
    Result kpResultSingle = null;
    Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
    hints.put(DecodeHintType.TRY_HARDER, true);
    //hints.put(DecodeHintType.PURE_BARCODE, true);

    try {
        kpResultMulti = kpReaderArr.decodeMultiple(Qr,hints);
    } catch (NotFoundException e) {
        // TODO Auto-generated catch block
        msbox("Exception","NotFoundException");
        e.printStackTrace();
    }

    if(kpResultMulti != null){
        msbox("Total Result" ,kpResultMulti.length +"");// + photo.getWidth() +     "Height=" + photo.getHeight());
        for(Result kp : kpResultMulti)
        {

            msbox("Results",kp.getText());
        }
    }
person user2801456    schedule 21.09.2013

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

https://code.google.com/p/zxing/

person androidgeek    schedule 27.02.2013
comment
не заметил, что я могу изменить настройку для сканирования нескольких кодов в сканере zxing, спасибо за это. Снова отлаживает исходный код сканера zxing. - person She Smile GM; 27.02.2013
comment
Массовое сканирование не имеет ничего общего с одновременным считыванием нескольких штрих-кодов, а с последовательным считыванием нескольких штрих-кодов. В приложении нет возможности сканировать сразу несколько штрих-кодов, но в библиотеке есть. - person Sean Owen; 27.02.2013
comment
@SeanOwen да, единственная возможность в приложении - это последовательное чтение нескольких штрих-кодов, но не чтение сразу. Но в библиотеке результат несовместим, любое предложение о том, как получить изображение с камеры, в моем конце, я использую camera.takePicture(null,null,mPicture), чтобы получить его. Немного сложно отлаживать библиотеку zxing, я заметил, что есть обратные вызовы resultpoint, я не уверен, как это работает, как его получить или для чего оно. - person She Smile GM; 28.02.2013