スキャンした瞬間、スマホの中で何が起きているのか
たった 1 秒の間に 7 つの処理が走る
スマホのカメラを白黒の模様にかざすと、約 1 秒でリンク先のページが開きます。この 1 秒間に、スマホの中では 7 つの処理が猛スピードで実行されています。(1) カメラがフレームを撮影、(2) 画像の中から模様の候補領域を検出、(3) 3 つのファインダーパターンを特定して位置と傾きを計算、(4) 模様をグリッドに分割して各マスの白黒を判定、(5) 2 進数のデータを文字列に変換、(6) 誤り訂正で破損データを修復、(7) URL と認識してブラウザを起動。
これらの処理はスマホの CPU と画像処理チップが分担して実行します。最新のスマホでは、カメラが 1 秒間に 30-60 フレームを撮影し、各フレームに対してリアルタイムで模様の検出を試みています。つまり、カメラをかざした瞬間から毎秒 30-60 回の「模様を探す」処理が走っているのです。
ステップ 1-2: 撮影と候補領域の検出
カメラが撮影した画像は、数百万個のピクセル (画素) の集まりです。この中から模様がある場所を見つけるために、まず画像を白と黒の 2 色に変換します (2 値化)。次に、黒いピクセルが密集している領域を「模様の候補」として検出します。
この処理で重要なのは「コントラスト」です。白い背景に黒い模様がくっきり印刷されていれば、候補領域の検出は一瞬で完了します。しかし、暗い場所や、模様の色が薄い場合は、白と黒の境界が曖昧になり、検出に時間がかかったり失敗したりします。「明るい場所でスキャンしてください」と言われるのは、このステップの精度を上げるためです。
ステップ 3-4: 位置特定とグリッド分割
候補領域が見つかると、次は 3 つのファインダーパターン (大きな四角い目印) を探します。この 3 つの位置関係から、模様の正確な位置、大きさ、傾きを計算します。斜めからスキャンしても読み取れるのは、この計算で傾きを補正しているからです。
位置が特定されると、模様全体を碁盤の目のようにグリッドに分割し、各マスが白か黒かを判定します。この判定は単純な「明るいか暗いか」ではなく、周囲のマスとの相対的な明るさで判断します。照明が均一でなくても正確に読み取れるのは、この相対判定のおかげです。
ステップ 5-6: デコードと誤り訂正
白黒の判定結果は 0 と 1 の列 (ビット列) になります。このビット列を、模様の規格に従って文字列に変換するのが「デコード」です。最初の数ビットにはデータの種類 (数字、英数字、漢字など) と長さが記録されているので、デコーダーはそれを読み取ってから本体のデータを変換します。
デコードと同時に、誤り訂正の処理も実行されます。汚れや傷で一部のマスが正しく読み取れなかった場合、予備のデータ (誤り訂正コード) を使って元のデータを復元します。この処理はリード・ソロモン符号という数学的アルゴリズムに基づいており、最大 30% の破損まで復元可能です。
ステップ 7: URL 認識とブラウザ起動
デコードされた文字列が URL (https:// で始まる文字列) であれば、スマホの OS がそれを認識し、ブラウザを起動してそのページを開きます。URL 以外のデータ (電話番号、メールアドレス、Wi-Fi 情報、テキスト) の場合は、それぞれに対応するアプリが起動します。
iPhone では、カメラアプリが URL を検出すると画面上部に黄色いバナーが表示され、タップするとブラウザが開きます。Android では、機種によって挙動が異なりますが、多くの場合は自動的にブラウザが起動します。この最後のステップまで含めて、すべてが 1 秒以内に完了するのは、現代のスマホの処理能力の高さを示しています。