ZXing конвертирует Bitmap в BinaryBitmap

Я использую OpenCV и Zxing, и я хотел бы добавить сканирование кода 2d. У меня есть несколько типов изображений, которые я мог бы отправить. Вероятно, лучшим является Bitmat (другой вариант – OpenCV Mat).

Похоже, вы использовали для этого:

Bitmap frame = //this is the frame coming in LuminanceSource source = new RGBLuminanceSource(frame); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); //then I can use reader.decode(bitmap) to decode the BinaryBitmap 

Однако RGBLuminaceSource выглядит так, что он больше не принимает bitmap в качестве входа. Итак, как еще я могу преобразовать входное изображение в BinaryBitmap ???

Редактировать:

Хорошо, поэтому я считаю, что добился определенного прогресса, но у меня все еще есть проблема. Я думаю, что у меня есть код, который преобразует битмап в правильный формат, однако теперь я получаю массивIndexOutOfBounds

 public void zxing(){ Bitmap bMap = Bitmap.createBitmap(frame.width(), frame.height(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(frame, bMap); byte[] array = BitmapToArray(bMap); LuminanceSource source = new PlanarYUVLuminanceSource(array, bMap.getWidth(), bMap.getHeight(), 0, 0, bMap.getWidth(), bMap.getHeight(), false); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Reader reader = new DataMatrixReader(); String sResult = ""; try { Result result = reader.decode(bitmap); sResult = result.getText(); Log.i("Result", sResult); } catch (NotFoundException e) { Log.d(TAG, "Code Not Found"); e.printStackTrace(); } } public byte[] BitmapToArray(Bitmap bmp){ ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 50, stream); byte[] byteArray = stream.toByteArray(); return byteArray; } 

Я получаю ошибку

 02-14 10:19:27.469: E/AndroidRuntime(29736): java.lang.ArrayIndexOutOfBoundsException: length=33341; index=34560 02-14 10:19:27.469: E/AndroidRuntime(29736): at com.google.zxing.common.HybridBinarizer.calculateBlackPoints(HybridBinarizer.java:199) 

Я записал размер байта [], и это длина, показанная выше. Я не могу понять, почему zxing ожидает, что он будет больше

Ладно, я понял. Как сказал Шон Оуэн, PlanarYUVLuminaceSource будет использоваться только для формата камеры по умолчанию для Android, и я думаю, что OpenCV не использует. Короче говоря, вот как вы это сделаете:

 //(note, mTwod is the CV Mat that contains my datamatrix code) Bitmap bMap = Bitmap.createBitmap(mTwod.width(), mTwod.height(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(mTwod, bMap); int[] intArray = new int[bMap.getWidth()*bMap.getHeight()]; //copy pixel data from the Bitmap into the 'intArray' array bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight()); LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(),intArray); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Reader reader = new DataMatrixReader(); //....doing the actually reading Result result = reader.decode(bitmap); 

Так вот, это совсем не сложно. Просто нужно было преобразовать Android Bitmap в целочисленный массив и его кусок пирога.

 public static String readQRImage(Bitmap bMap) { String contents = null; int[] intArray = new int[bMap.getWidth()*bMap.getHeight()]; //copy pixel data from the Bitmap into the 'intArray' array bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight()); LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(), intArray); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Reader reader = new MultiFormatReader();// use this otherwise ChecksumException try { Result result = reader.decode(bitmap); contents = result.getText(); //byte[] rawBytes = result.getRawBytes(); //BarcodeFormat format = result.getBarcodeFormat(); //ResultPoint[] points = result.getResultPoints(); } catch (NotFoundException e) { e.printStackTrace(); } catch (ChecksumException e) { e.printStackTrace(); } catch (FormatException e) { e.printStackTrace(); } return contents; } 

Bitmap – это class Android. Формат изображения по умолчанию для Android по умолчанию – это плоский формат YUV. Вот почему PlanarYUVLuminanceSource только PlanarYUVLuminanceSource и существует для Android. RGBLuminanceSource придется портировать.

Вы помещаете совершенно неправильные данные в class. Ожидается, что пиксели в формате плана YUV. Вы передаете сжатые байты файла JPEG.

Давайте будем гением компьютера.