2015-01-21 2 views
5

Моя цель заключается в выявлении нескольких datamatrices на более крупное изображение, как это (четыре большие):сканирование нескольких штрих-кодов с zxing.net

full image

На основе нескольких примеров кода, я сделал небольшую тестовую программу :

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

Он не может обнаружить какой-либо код на большом изображении.

Но он может обнаружить код, когда его обрезается так:

cropped

После этого я слиты два сгенерированных матриц данных, и это тоже не получилось:

enter image description here

Последняя Я провела еще два теста со слегка обрезанными изображениями: оба были неудачными:

enter image description here

enter image description here

Так кажется, эта библиотека не является надежным вообще, или, может быть, я использую это неправильно.

Любая идея, как улучшить мои результаты? (В том числе других библиотек и предварительной обработки)

ответ

3

Это не может быть сказано, что библиотека не является устойчивой, но есть два ключевых факторов, влияющих на вас здесь:

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

Моя рекомендация - реализовать свой собственный MultipleBarcodeReader с учетом того, что я упомянул.

Наивный подход может заключаться в том, чтобы отображать образцы изображений по центру сетки точек, расположенных друг от друга, поэтому каждая матрица данных (независимо от ее положения внутри изображения) содержит по крайней мере одну из точек внутри. Вам просто нужно убедиться, что исключить дублированные коды.