2012-01-10 18 views
0

色付きQRコードをZXingライブラリでJavaでデコードしようとしています。いくつかの研究から、私はZXingがすでにこれを行う能力を持っていることを知っています。しかし、私は2日間これをやってきました。私がやったことは、ファイルからQRイメージを読んで、イメージの中で最も暗くて明るい色を計算しようとしています。次に、すべてのフォアグラウンドピクセルを黒に変更し、他のものを白に変更します。この後、標準のQRコードと同じようにQRコードを取得します。次に、QRコードを読み取る関数を使用します。JavaでZXingライブラリを使用してカラー画像をデコードする

ただし、これは2色のQRコードでのみ機能し、3色になるとほとんどの場合は機能しません。ただし、カラー画像からグレー画像に変換された新しい画像は、エラー訂正率を超えてはなりません。

私は他の方法を試みましたが、それぞれの方法は、特定の種類のQRコード(ロゴ、マルチカラー、形状のファインダーパターンなど)のためだけに働いていました。

私が探しているのは、あらゆる種類のQRコードをデコードする方法です。少なくとも多色で整形されたファインダーパターンの場合。これは私がロゴの事のようなもので(第三QRを復号化するためにも使用さthisページ(第2 QR)の上に緑のQRを復号化するために使用しているコードがある

  1. :詳細については

    同じウェブサイトをご覧ください)アライメントパターン上に間違いなく

    public class Decoder 
    { 
        public static void main(String[] args) 
        { 
          // input image file 
          File imageFile = new File("/Users/Desktop/QR/green.png"); 
    
        BufferedImage image = null; 
        try 
        { 
         image = ImageIO.read(imageFile); 
    
        } 
        catch (IOException e) 
        { 
         System.out.println("io outch"); 
    
        } 
    
        int imageWidth = image.getWidth(); 
        int imageHeight = image.getHeight(); 
        int total = 0; 
        int dark = image.getRGB(0, 0); 
        int light = image.getRGB(0, 0); 
        int backgroundColor = 0; 
        int foregroundColor = 0; 
    
        FinderPattern topLeftFinder; 
    
        for (int x = 0; x < imageWidth; x ++) 
        { 
         for (int y = 0; y <imageHeight; y ++) 
         { 
          total = total + image.getRGB(x, y); 
         } 
        } 
    
        //int average = total/(imageWidth * imageHeight); 
        //System.out.println("total" + total + " average " + average); 
    
        for (int x = 0; x < imageWidth; x ++) 
        { 
         for (int y = 0; y <imageHeight; y ++) 
         { 
          if (image.getRGB(x, y) < dark) 
          { 
           dark = image.getRGB(x, y); 
          } 
          if (image.getRGB(x, y) > light) 
          { 
           light = image.getRGB(x, y); 
          } 
         } 
        } 
    
        for (int x = 0; x < imageWidth; x ++) 
        { 
         for (int y = 0; y <imageHeight; y ++) 
         {  
          if (image.getRGB(x, y) >= (dark - light)/4) 
          { 
           image.setRGB(x, y, -1); 
          } 
          else if (image.getRGB(x, y) <= (dark - light) * 3/4) 
          { 
           image.setRGB(x, y, -16777216); 
          } 
          else 
          { 
           image.setRGB(x, y, -1); 
          } 
         } 
        } 
        System.out.println("total" + dark + " average " + light); 
    
        File outputFile = new File("/Users/Desktop/QR/outputQR.png"); 
        //ImageIO.write(image, "png", file); 
    
        try 
        { 
         ImageIO.write(image, "png", outputFile); 
        } 
        catch (IOException e) 
        { 
         System.out.println(e.getMessage()); 
        } 
    
        // creating binary bitmap from source image 
        LuminanceSource lumSource = new BufferedImageLuminanceSource(image); 
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(lumSource)); 
    
    
        Hashtable<DecodeHintType, Object> hint = new Hashtable<DecodeHintType, Object>(); 
        hint.put(DecodeHintType.TRY_HARDER, BarcodeFormat.QR_CODE); 
    
        // decoding 
        QRCodeReader QRreader = new QRCodeReader(); 
        Result result = null; 
    
        try 
        { 
         result = QRreader.decode(bitmap, hint); 
        } 
        catch (ReaderException e) 
        { 
         System.out.println("error during reading"); 
        } 
    
        // getting output text 
        String decodedText = result.getText(); 
    
        System.out.println(decodedText); 
    
    } 
    } 
    
  2. ワーキングそして、これはもともと正常に動作しているが、それは今働いていない理由を知らないthis QRを復号化するために使用されるコードでされていません。そして、このコードは上記のQRを解読しません。 QRコードをマングリング

    public class Decoder 
    { 
        public static void main(String[] args) 
        { 
          // input image file 
          File imageFile = new File("/Users/Desktop/QR/bigfinderQR.png"); 
    
        BufferedImage image = null; 
        try 
        { 
         image = ImageIO.read(imageFile); 
    
        } 
        catch (IOException e) 
        { 
         System.out.println("io outch"); 
    
        } 
    
        // creating binary bitmap from source image 
        LuminanceSource lumSource = new BufferedImageLuminanceSource(image); 
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(lumSource)); 
    
    
        Hashtable<DecodeHintType, Object> hint = new Hashtable<DecodeHintType, Object>(); 
        hint.put(DecodeHintType.TRY_HARDER, BarcodeFormat.QR_CODE); 
    
        // decoding 
        QRCodeReader QRreader = new QRCodeReader(); 
        Result result = null; 
    
        try 
        { 
         result = QRreader.decode(bitmap, hint); 
        } 
        catch (ReaderException e) 
        { 
         System.out.println("error during reading"); 
        } 
    
        // getting output text 
        String decodedText = result.getText(); 
    
        System.out.println(decodedText); 
    
    } 
    

    }

答えて

1

各ピクセルの計算された輝度に基づいて2値化されます。合理的に暗闇のようなものは何でも良いはずです。千の色がいいです。ライトオンダーク(反転)の場合は、イメージを反転するか、コードを変更してイメージを反転する必要があります。これはほとんど確実に問題ではありません。

このように無効にする方が簡単なので、ファインダーパターンを歪曲させることはやりがいのあるビジネスです。 1:1:3:1:1の暗 - 明 - 暗 - 明 - 暗の比率を、パターンを水平方向と垂直方向にスキャンして、ほぼ保存する必要があります。コーナーを少し丸めても問題ありません。たとえば、黒いモジュールの間に空白を入れることはできませんでした。

デコードしようとしている元の画像を投稿できますか?私はあなたに正しいことと間違ったことを非常に迅速に伝えることができました。

+0

こんにちは、私はオリジナルの投稿を編集しました。これらの変更を確認して、私が探しているものを教えてください。私がやっていることは、ZXingライブラリでJavaを使ってデコーダ/バリデータを設計することです。私の英語はそれほど良いものではないので、私が混乱させるものを作ってくれたら、私に知らせてください。ありがとう。 – user1139921

+0

あなたが言ったことのもう一つのことは、「コーナーをちょっと丸めても問題ありません。各コードワードまたはモジュールをどれだけ丸めるか、または歪めることができるかについての制限がありますが、デコーダは引き続き読み取ることができます。 – user1139921

+0

私は厳しい制限を与えることができませんでした。私は、デコーダが縦横に1:1:3:1:1の比率でプラスとマイナスの小さなファクタを白黒で見ている点を探します。驚くほど寛大ですが、これはイメージの領域であり、少なくとも混乱させるべきです。 –

0

は常に危険です。 ZXingはISO標準に準拠するように定義されています。色分けされたコードは、「整形されたファインダーパターン」にとどまらず、どこにも標準ではありません。 QRコードを歪ませると、すべてではないにしてもいくつかのデコーダが失敗すると予想されるはずです。

ZXingは、標準画像を最大限に活用するように設計されています。それをするために行うことのいくつかは、実際に歪んだ画像でうまく動作しないようにします。例えば、影付きの画像のデコード率を向上させるアルゴリズムは、均一に点灯しているがカラーの画像を扱うことができません。

そして、ZXingはファインダーパターン歪みに敏感であることが知られています。このような歪みは非標準的なものなので、それを変更することに興味はありません。

関連する問題