Qraft (クラフト)

スマホのカメラにはこんな秘密がある - 読み取りの裏側を覗いてみよう

カメラは「光のセンサー」でできている

スマホのカメラの正体は、数千万個の小さな光センサーが並んだチップです。このチップを「イメージセンサー」と呼びます。レンズを通って入ってきた光が、センサーの 1 つ 1 つに当たり、「ここは明るい」「ここは暗い」という情報が数字に変換されます。この数字の集まりが写真の正体です。

白黒の模様を読み取るとき、カメラは色よりも「明るさの差」に注目しています。白い部分は光をたくさん反射するので数字が大きくなり、黒い部分は光を吸収するので数字が小さくなります。この明暗の差がはっきりしているほど、読み取りの精度が上がります。暗い場所でうまく読み取れないのは、この明暗の差が小さくなるからです。

ピントが合う仕組み - オートフォーカスの正体

カメラを模様にかざすと、一瞬でピントが合います。これは「オートフォーカス」という機能のおかげです。多くのスマホは「位相差 AF」という方式を使っていて、センサーに届く光のズレ具合からピントの合う距離を計算します。人間の目が左右の視差で距離を測るのと同じ原理です。

ピントが合うまでの時間は、一般的なスマホで約 0.03 秒。まばたきよりも速いです。ただし、カメラと模様の距離が近すぎると (5 cm 以下)、レンズの構造上ピントが合わなくなります。逆に遠すぎると、模様が小さくなりすぎて細部が読み取れません。10-30 cm がちょうどいい距離です。

読み取りソフトが「模様の意味」を解読する

カメラが撮影した画像は、そのままでは単なる白黒の写真です。ここからが読み取りソフト (デコーダー) の出番です。デコーダーはまず、画像の中から 3 つの大きな四角い目印を探します。この目印は「ファインダーパターン」と呼ばれ、模様の位置と傾きを特定するための手がかりです。

目印が見つかると、デコーダーは模様全体を碁盤の目のように区切り、各マスが白か黒かを判定します。白は「0」、黒は「1」に変換され、0 と 1 の並びが文字や URL に復元されます。この処理はスマホの中で 1 秒もかからずに完了します。

汚れや傷があっても読める理由

模様の一部が汚れたり傷ついたりしても読み取れることがあります。これは「誤り訂正」という仕組みのおかげです。模様には本来のデータに加えて「予備のデータ」が埋め込まれていて、一部が欠けても残りの情報から元のデータを復元できます。

誤り訂正には 4 段階のレベルがあり、最も強いレベルでは全体の 30% が欠けても復元できます。ただし、誤り訂正を強くするほど模様が大きく (複雑に) なるというトレードオフがあります。名刺のように小さく印刷したい場合は弱めに、屋外の看板のように汚れやすい場所では強めに設定するのが一般的です。

暗い場所でも読める工夫

薄暗い室内や夜間でも QR コードが読み取れるのは、カメラが周囲の明るさに合わせて取り込む光の量を自動で調整しているからです。光が少ない場面では、より多くの光を取り込もうとし、明るすぎる場面では取り込む量を抑えます。それでも光が足りないときは、画像が暗くなり、模様の明暗が見分けにくくなって読み取りに失敗しやすくなります。そんなときは、画面の明るさを上げたり、コードに光が当たる向きへ少し動いたりすると改善します。カメラの調整を助けてあげることが、読み取り成功の近道です。

近すぎても遠すぎても読めない理由

QR コードにスマートフォンを近づけすぎると、かえって読み取れないことがあります。これは、カメラがピントを合わせられる距離に限界があるためです。近すぎると焦点が合わず、模様がぼやけてしまいます。逆に遠すぎると、一つひとつのマスが小さく写りすぎて、明暗を見分けられなくなります。うまく読み取れないときに、スマートフォンを近づけたり遠ざけたりして調整するのは、カメラがちょうどピントを合わせられる距離を探しているからです。ほどよい距離を見つけることが、すばやい読み取りにつながります。

なぜバーコードより速く読めるのか

スーパーのレジで使われるバーコードは、横方向にしか情報を持っていません。1 次元の情報です。一方、白黒の四角い模様は縦と横の 2 方向に情報を持つ「2 次元コード」です。同じ面積に格納できる情報量が桁違いに多く、バーコードが最大 20 文字程度なのに対し、2 次元コードは最大 7,089 文字を格納できます。

読み取り速度が速い理由は、3 つの目印のおかげで「どの角度からでも一瞬で位置を特定できる」からです。バーコードはレーザーを横に走らせて読み取るため、角度を合わせる必要があります。2 次元コードはカメラで全体を一度に撮影するので、斜めからでも逆さまからでも読み取れます。