2009-10-28 2 views
8

Я ищу хорошую библиотеку с открытым исходным кодом, которая может находить и читать штрих-код с изображения (по сравнению с использованием сканера штрих-кода). Из других вопросов, связанных с переполнением стека, я обнаружил, что ZXing («Zebra Crossing») неплох. Хотя он создан для Java, есть порт C#, однако я считаю, что он может быть не полным. Как вы думаете, достаточно ли , чтобы разобрать штрих-код из такой ситуации или какая-то другая библиотека лучше?ZXing («Zebra Crossing») в C#

EDIT: Как указано в комментариях, я должен просто попробовать сначала. Вау, я об этом не думал. :), но я думаю, мой вопрос в том, является ли частичный порт достаточно надежным - если кто-то из вас использовал его раньше, может ли он сканировать с успехом?

+3

Почему бы вам просто не узнать, попробовать? –

+0

@ Ed О, эм, ду! Ха-ха, ты знаешь, мне кажется, мне нужно закрыть мой вопрос. Oopsey. –

+0

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

ответ

2

Это зависит от того, для чего вы его используете, конечно. Даже Java-версия zxing имеет некоторые важные ограничения и проблемы с производительностью. Например, он может найти только один штрих-код на странице. Кроме того, алгоритмы, которые он использует для поиска 1-D штрих-кода на странице, не особенно эффективны (не знаю об алгоритмах для двумерных штрих-кодов), которые не были частью требований к проекту, над которым я работал). Это все, что можно решить - я начал совершенствоваться несколько месяцев назад и смог значительно улучшить производительность и надежность местоположения в 1-D месте, но наши приоритеты dev были сдвинуты, поэтому я не работал над этим с тех пор.

Что касается того, является ли частичный порт C# хорошим, если вы хотите отправить сообщение обратно с какими различиями, я буду рад прокомментировать.

EDIT - вот некоторые из рефакторинга, что я сделал:

Во-первых, вынесем RowNumberStrategy следующим образом:

public interface RowNumberStrategy { 
public int getNextRowNumber(); 

public class OriginalRowStrategy implements RowNumberStrategy{ 
    int middle; 
    boolean tryHarder = false; 
    int rowStep; 
    int maxLines; 
    int maxRows; 

    int x; 

    public OriginalRowStrategy(int maxRows, boolean tryHarder) { 
     this.x = 0; 
     this.maxRows = maxRows; 
     this.middle = maxRows >> 1; // divide by 2 
     this.tryHarder = tryHarder; 
     rowStep = Math.max(1, maxRows >> (tryHarder ? 7 : 4)); 
     if (tryHarder) { 
      maxLines = maxRows; // Look at the whole image, not just the center 
     } else { 
      maxLines = 9; // Nine rows spaced 1/16 apart is roughly the middle half of the image 
     } 
    } 

    public int getNextRowNumber() { 
     if (x > maxLines) 
      return -1; 

     int rowStepsAboveOrBelow = (x + 1) >> 1; 
     boolean isAbove = (x & 0x01) == 0; // i.e. is x even? 
     int rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow); 
     if (rowNumber < 0 || rowNumber >= maxRows) { 
      // Oops, if we run off the top or bottom, stop 
      return -1; 
     } 

     x = x + 1; 

     return rowNumber; 
    } 

} 

public class LinearScanRowStrategy implements RowNumberStrategy{ 
    private final int maxRows; 
    private int currentRow; 
    public LinearScanRowStrategy(int totalRows) { 
     maxRows = totalRows; 
     currentRow = 0; 
    } 

    public int getNextRowNumber() { 
     if (currentRow > maxRows) 
      return -1; 

     return maxRows - 1 - currentRow++; 
    } 

} 

public class ProgressiveScanRowStrategy implements RowNumberStrategy{ 
    private final int maxRows; 
    private int currentStepSize; 
    private int currentStep; 

    public ProgressiveScanRowStrategy(int totalRows) { 
     maxRows = totalRows; 
     currentStep = 0; 
     currentStepSize = maxRows; 
    } 

    public int getNextRowNumber() { 
     int nextRow = (currentStep++) * currentStepSize; 
     if (nextRow < maxRows) 
      return nextRow; 

     currentStepSize = currentStepSize >> 1; 
     if (currentStepSize <= 0) 
      return -1; 
     currentStep = 1; 

     nextRow = currentStep * currentStepSize; 

     return nextRow; 
    } 

} 



} 

тогда верхняя часть doDecode будет выглядеть следующим образом:

private Result doDecode(MonochromeBitmapSource image, Hashtable hints) throws ReaderException { 


int width = image.getWidth(); 
int height = image.getHeight(); 
BitArray row = new BitArray(width); 
boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); 
RowNumberStrategy rowProvider = new RowNumberStrategy.ProgressiveScanRowStrategy(height); 

int rowNumber; 
while ((rowNumber = rowProvider.getNextRowNumber()) != -1){ 
... 
} 

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

+0

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

+0

Я обязательно проверю MBR - спасибо за подсказку. Алгоритмически стратегия сканирования не работает эффективно для больших изображений (скажем, 3300 строк), поскольку использует фиксированный подход к шагу. Я отправлю обратно с тем, что я говорю в полном посте, чтобы я мог показать код. –

+0

Нет, шаг сканирования является функцией высоты - по умолчанию он пропускает высоту/16 строк изображения на каждом шаге. –

-1

Попробуйте выполнить компиляцию java-версии с помощью ikvmc, чем получить доступ к ее коду C#.

3

Я использую версию java более года, сканирование около 100 ежедневно, и она отлично работает. Я не вижу причин, чтобы версия C# была хуже.

 Смежные вопросы

  • Нет связанных вопросов^_^