2009-10-28 12 views
8

私は、バーコードスキャナを使用するよりも、画像からバーコードを見つけて読み取ることができる、優れたオープンソースライブラリを探しています。 Stack Overflowに関する他の質問から、ZXing( "Zebra Crossing")がかなり良いことがわかりました。 Java用に作られていますが、C#ポートがありますが、完全でない可能性があります。このような状況からバーコードを解析するのに十分なと思っていますか?C#のZXing( "Zebra Crossing")

EDIT: Edがコメントで指摘したように、私はまずそれを試してください。うわー、私はそれを考えなかった。 :)しかし、私の質問は、部分的なポートが十分に信頼できるかどうかということです。あなたが以前にそれを使用したことがあるなら、それは熟練してスキャンできますか?

+3

なぜあなただ​​けが知っているのですか?それを試してみませんか? –

+0

@Ed Oh、um、duh!あなたは知っている、私は私の質問を閉じる必要があると思う。 Oopsey。 –

+0

さて、質問自体は将来の人にとっては役に立ちそうなので、私はそれを閉じるのが正しいとは思わない。また、学習に時間を要する洞察を持つ人もいれば、一目で見逃すかもしれません。私はちょうどその時、それを試してみることが私の最初の目標であることを示唆していました。 –

答えて

2

これはもちろん、それを使用しているかどうかによって異なります。 zxingのJavaバージョンであっても、いくつかの重要な制限とパフォーマンスの問題があります。たとえば、ページ上に1つのバーコードしか見つからない場合などです。また、ページ上に1次元バーコードを配置するために使用するアルゴリズムは、特に効率的ではありません(2次元バーコードのアルゴリズムについては、私が取り組んでいるプロジェクトの要件の一部ではありませんでした)。これは対処できるすべてのものです。私は数ヶ月前に機能拡張を開始し、1次元のロケーションのパフォーマンスと信頼性を大幅に向上させることができましたが、私たちの開発者の優先順位がシフトして以来、私はそれに取り組んでいません。

C#への部分的なポートが良いかどうかについては、相違点を投稿したい場合はコメントしてください。

EDITは - ここで私がやったリファクタリングの一部です:

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の上部には次のようになります:次のように

まず、RowNumberStrategyを考慮

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版を1年以上使用しており、毎日約100回スキャンしています。 私はC#のバージョンが悪くなる理由はないと思う。

関連する問題