2016-07-18 30 views
0

以下のデータマトリックスは、バーコードスキャナー、zxingモバイルアプリケーションを使用して読み込み中です。しかし、同じことがzxing javaライブラリによって読み取られていません。DataMatrix/QRコードを読むzxing java

画像変換コードにコメントがあります。画像の変換、回転、拡大/縮小などは役に立ちません。

理想的には、復号化されるまで、プログラム可能なすべての画像前処理を実行したいと考えています。

コンピュータ画面から同じ画像をスキャンしていて動作しているため、モバイルアプリが使用するロジックは何ですか?

以下のコードはデコードに使用しています。

public class BarcodeReader { 

    private static Map<DecodeHintType,Object> hintsMap; 

    public static void main(String...args){ 

     BufferedImage before = null; 
     hintsMap = new EnumMap<DecodeHintType, Object>(DecodeHintType.class); 
     hintsMap.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); 
     hintsMap.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.allOf(BarcodeFormat.class)); 
     //hintsMap.put(DecodeHintType.PURE_BARCODE, Boolean.FALSE); 
     try 
     { 
      before = ImageIO.read(new File("C:/ocr.jpg")); 
      decode(before); 
      /* for(int i=1; i < 1000;i++){ 
       AffineTransform transform = new AffineTransform(); 
       double rad = (double)i/100; 
       double scale = (double)i/100; 
       System.out.println("rad "+scale); 
       //transform.rotate(rad, before.getWidth()/2, before.getHeight()/2); 
       transform.scale(scale, scale); 
       BufferedImage after = new BufferedImage(before.getWidth(), before.getHeight(), BufferedImage.TYPE_INT_ARGB); 
       AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); 
       after = op.filter(before, after); 
       decode(after); 
      }*/ 


      //tmpBfrImage = tmpBfrImage.getSubimage(200, 100, 800, 800); 
     } 
     catch (IOException tmpIoe) 
     { 
      tmpIoe.printStackTrace(); 
     } 


    } 

    public static void decode(BufferedImage tmpBfrImage){ 
     if (tmpBfrImage == null) 
      throw new IllegalArgumentException("Could not decode image."); 
     LuminanceSource tmpSource = new BufferedImageLuminanceSource(tmpBfrImage); 
     BinaryBitmap tmpBitmap = new BinaryBitmap(new HybridBinarizer(tmpSource)); 
     MultiFormatReader tmpBarcodeReader = new MultiFormatReader(); 

     Result tmpResult; 
     String tmpFinalResult; 
     try 
     { 
      if (hintsMap != null && ! hintsMap.isEmpty()) 
       tmpResult = tmpBarcodeReader.decode(tmpBitmap, hintsMap); 
      else 
       tmpResult = tmpBarcodeReader.decode(tmpBitmap); 
      // setting results. 
      tmpFinalResult = String.valueOf(tmpResult.getText()); 
      System.out.println(tmpFinalResult); 
      System.exit(0);; 
     } 
     catch (Exception tmpExcpt) 
     { 
     tmpExcpt.printStackTrace(); 
     } 
    } 

} 

Sample Barcode

答えて

0

私は複数のレベルで問題を抱えていました。私はgithubからzxingソースをダウンロードし、それをデバッグしました。ヒントねじアップ認識hintsMap.put(DecodeHintType.PURE_BARCODE, Boolean.FALSE);

がDataMatrixReaderのための彼らのソースコードを見てみると、最初の問題は、以下の行を追加した

  1. 、この

    if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE))

    そうする行がありましたPURE_BARCODEをtrueまたはfalseに設定するかどうかにかかわらず、trueとみなします。理想的には、ヒントにはキーが含まれてはいけません。

  2. 第2の問題は、DataMatrixの検出器の動作にありました。 Detector detecting L

    検出器は、各頂点からの黒と白の遷移の数を調べることによって 'L'を識別していました。理想的には、上 - 左から下 - 左と下 - 左から下 - 右への遷移は0の遷移であるべきである。

    しかし、線がボックスの外縁に近づくにつれて、遷移は0にならなかった。私はそれを左と下の黒線の中心に近づけるように変更を加えました。これは、垂直の赤い線を右に移動し、下の赤い線を少し上に移動することを意味します。私は必要な修正を加える新しい方法の修正ポイントを追加しました。この補正は私のために働く、理想的には補正を少しスマートにするべきである。これらの変更を行った後

    ResultPoint pointA = correctPoints(cornerPoints[0], Vertices.TOPLEFT); 
    ResultPoint pointB = correctPoints(cornerPoints[1], Vertices.BOTTOMLEFT); 
    ResultPoint pointC = correctPoints(cornerPoints[2], Vertices.TOPRIGHT); 
    ResultPoint pointD = correctPoints(cornerPoints[3], Vertices.BOTTOMRIGHT); 
    
    --- 
    --- 
    
    private ResultPoint correctPoints(ResultPoint point, Vertices vertice){ 
        if(vertice.equals(Vertices.TOPLEFT)) 
         return new ResultPoint(point.getX()+10, point.getY()+5); 
        else if(vertice.equals(Vertices.BOTTOMLEFT)){ 
         return new ResultPoint(point.getX()+10, point.getY()-5); 
        }else if(vertice.equals(Vertices.TOPRIGHT)){ 
         return new ResultPoint(point.getX(), point.getY()+10); 
        }else{ 
         return new ResultPoint(point.getX()-10, point.getY()-5); 
        } 
    
    } 
    

、データマトリックス検出がほど不良またはこれらよりも劣っていた画像のために働きました。

関連する問題