Сканирование нескольких штрих-кодов с zxing.net
Моя цель состоит в том, чтобы обнаружить несколько матриц данных на большом изображении, таком как это (четыре больших):
Основываясь на нескольких примерах кода, я сделал небольшую тестовую программу:
Bitmap image = getImage();
DataMatrixReader reader = new DataMatrixReader();
GenericMultipleBarcodeReader genericReader = new genericMultipleBarcodeReader(reader);
Dictionary<DecodeHintType, object> hints = new Dictionary<DecodeHintType,object>();
hints.Add(DecodeHintType.TRY_HARDER, true);
BitmapLuminanceSource source = new BitmapLuminanceSource(image);
HybridBinarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Result[] results = genericReader.decodeMultiple(binaryBitmap,hints);
show(results);
Он не может обнаружить код на большом изображении.
Но он может обнаружить код, если его обрезать так:
После этого я объединил две сгенерированные матрицы данных, и это тоже не удалось:
В последний раз я провел еще два теста со слегка обрезанными изображениями, но оба не удалось:
Так что, похоже, эта библиотека совсем не устойчива, или, может быть, я неправильно ее использую.
Есть идеи, как улучшить мои результаты? (включая другие библиотеки и предварительную обработку)
1 ответ
Нельзя сказать, что библиотека не является надежной, но здесь на вас влияют два ключевых фактора:
- Алгоритм обнаружения матрицы данных Zxing предполагает, что штрих-код центрирован. Точнее, центр изображения находится внутри матрицы данных.
- Многофункциональный считыватель Zxing особенно не работает, когда штрих-коды выровнены по сетке.
Моя рекомендация - реализовать свой собственный MultipleBarcodeReader
принимая во внимание то, что я упомянул.
Наивным подходом может быть выборка изображений, центрированных по сетке точек, расположенных так, чтобы каждая матрица данных (независимо от ее положения в изображении) содержала хотя бы одну из точек внутри. Вы просто должны исключить дублирование кодов.