QRコードの読み取りの仕組み
QRコードを読み取る仕組みについて
QRコードには以下のようなパターンが必ず印字されています。
そしてQRコードの特徴は何といっても3つある四角いファインダーパターンです。
このファインダーパターンを3つ見つけるだけで、向きがわかります。
四角形が無い角が必ず右下に来るので、以下の画像ですと逆さまであることがわかると思います。
おまけに全て角にあるので、四角形を直線で結ぶだけで印字領域が特定できます。
そのため傾いていたり、歪んでいても印字の領域を正確に抽出することが出来ます。
なので、QRコードは3つのファインダーパターンさえ見つけられれば、ほぼ読み取りに成功することが出来ます。
ただ、現実ではハードウェアの計算リソースが足りなかったり、画像が大きすぎて処理時間がかかりすぎてしまって運用が出来ないケースなどがあります。
そのため、なるべく計算量を落とすアルゴリズムが重要になってきます。
アルゴリズムは速度面の実用性を踏まえると最小の手数でスクラッチ、あるいは限られたセロテープで銀はがしをするような感覚です。
せっかくなのでスクラッチっぽくやっていこうと思います。
削る量が増えるほど演算量が増えて時間がかかると思ってください。
まずは全面がグレーです。
ここで1ラインだけ削ってみます。
拡大してドット数を表示してみると…
これだけだとなんだかわかりませんね。
ファインダーパターンを見つけるためには、ドット数が1:1:3:1:1のところを見つけます。
ではドット数を表示してみましょう
ピ、ピクロス…!?
楽しくなってきましたね~(´∀`)
今回は運よく2箇所もファインダーパターンらしいところがありました。
今度はファインダーパターンらしい部分の中心から縦に削ってみましょう
大漁、大漁!( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \
3つも見つけてしまいました
でも1ライン上に3つ存在してはいけないんですよね( ´д`ll)ゲッソリ
なのでどれかは偽物です。
偽物か確認するために再び横に削ってみましょう
ファインダーパターンが下のラインだけにありましたね。
なので上は偽物です。
これだけで3つのファインダーパターンが見つかりました。
あとはルールに従って読み解くだけです。
細かいことは割愛しますが、この時点で1モジュールあたりのピクセル数(PPM)がわかります。
なので、PPM間隔でサンプリングしていくと黒、白、黒…のような全ての印字パターンを把握することが出来ます。
最後に黒、白、黒…のパターンを0,1,0のようにビット変換して復号化すると文字列が取得できます。
ピクロスが好きな人はやってみたくなったのではないでしょうか
ここまで書きましたが、あくまでも個人的な解釈なのであしからず