一枚の画像ファイルの中からいわゆるQRコードを切り出したい(座標を抽出した い)…と思ったのですが、探しても意外とオープンソースなツールがなかった ので自作してみました。
QRコードには位置決めパタン(3隅にある四角いあれ)があります。これを 見つけるのが正攻法、ということでそうします。以下がアルゴリズムです。 要するにアスペクト比が1に近い中心が黒 (ここでは説明のため白地に黒のコードがあると仮定しています。) の環状の領域を探すだけ、です。 まず擬似コードで書くとこんな感じです。
1 makeImageBW() 2 foreach p in all_pixel{ 3 [cog, aspectRatio] = paintWhiteAndCalcCoGAndAspectRatio(p) 4 if(isBlack(cog) and isAlmostOne(aspectRatio)){ 5 addCandidate(cog) 6 } 7 }
続いて日本語で説明します。
なぜこんな単純でいいのか、ということですが、どうも検出パタンのような 『中心に黒がある黒い環形領域』って、そうそうないからみたいです。 だからこんなんで けっこう精度良く検出できます。デンソーウェーブのQR作った人、偉いです。 もちろん意図的に 目玉みたいな模様を書いたらバッチリ誤検出しますが、そしたら3つのパタンの 位置関係あたりから何とかしてみてください。
準備中