3

zxingライブラリ(GenericMultipleBarcodeReader)を使用して2Dデータマトリックスバーコードを読み取ろうとしています。1つの画像に複数のバーコードがあります。

問題は、zingリーダーの効率が非常に低く、画像1.pngから1つのバーコードを認識し、48のバーコードを持つ画像2.pngからバーコードを認識しないことです。100%の効率または100%の結果をもたらす他のライブラリを取得する方法はありますか?

バーコードを読み取るための私のコードは次のとおりです。

public static void main(String[] args) throws Exception {
        BufferedImage image = ImageIO.read(new File("1.png"));
        if (image != null) {
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

            DataMatrixReader dataMatrixReader = new DataMatrixReader();

            Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

            GenericMultipleBarcodeReader reader = new GenericMultipleBarcodeReader(
                    dataMatrixReader);
            Result[] results = reader.decodeMultiple(bitmap, hints);

            for (Result result : results) {
                System.out.println(result.toString());
            }
        }
    }

そして私が使用した画像は次のとおりです。

1.png 2.jpg

この問題の解決にご協力ください。

ありがとう

4

2 に答える 2

5

このようにはうまくいきません。グリッドと互換性のない特定の方法で画像を切り取ることができると想定しているため、グリッド内のバーコードは読み取られません。画像をスキャン可能な領域に分割するには、独自のメソッドを作成する必要があります。

また、DataMatrixデコーダーが画像の中心がバーコードの内側にあると想定している場合もあります。これは、画像を円柱の周りの正方形に事前に切り刻んでからスキャンする必要があるもう1つの理由です。その場合はかなりうまくいくはずです。

于 2012-10-04T07:08:19.000 に答える
2

別の解決策は、1つのドキュメントでさまざまな方向の複数のバーコードを検出できるバーコードエンジンを検討することです。Windowsで実行している場合、ClearImageバーコードSDKにはJava APIがあり、前処理なしでニーズを処理できるはずです。あなたは彼らのエンジンが彼らのオンラインバーコードリーダーを使ってあなたの画像を読むことができるかどうかをテストすることができます。

いくつかのサンプルコード:

public static void testDataMatrix () {
  try { 
       String filename  = "1.png ";
       CiServer objCi = new CiServer();
       Ci = objCi.getICiServer();

       ICiDataMatrix reader = Ci.CreateDataMatrix(); // read DataMatrix Barcode
       reader.getImage().Open(filename, 1);
       int n = reader.Find(0); // find all the barcodes in the doc
       for (i = 1; i <= n; i++) {
          ICiBarcode Bc = reader.getBarcodes().getItem(i); // getItem is 1-based
          System.out.println("Barcode " + i + " has Text: " + Bc.getText());
       }
   } catch (Exception ex) {System.out.println(ex.getMessage());}
 }

免責事項:私は過去にInliteのためにいくつかの仕事をしました。

于 2014-08-21T22:55:23.833 に答える