その1回を、見えない光が見ている。

iPhoneの腕立てカウントから、TrueDepthのしくみをのぞいてみよう。

iPhoneを床に置く。顔を画面に向けて、体を下げる。もう一度、腕を伸ばす。

ポン、と1回。画面を触っていないのに、腕立ての回数が増える。

腕鍛帳は、顔が近づいて、離れる動きを読み取っています。使っているのは、Appleの顔追跡技術「ARKit」。多くのiPhoneでその奥行きの情報を支えるのが、Face IDにも使われる「TrueDepth」です。

でも、そもそもカメラは平らな写真を撮るもの。どうして「顔がある」だけでなく、「顔までの距離」まで分かるのでしょう?

iPhoneから顔へ赤外線の点を投影し、別の位置のカメラがその点を読み取る概念図
顔の上に、見えない光の目印を置く。図の色や点の数、部品の配置は説明用です。

写真だけだと、「小さい顔」と「遠い顔」は似ている

普通の写真でも、近づけば顔は大きく写り、離れれば小さく写ります。これは距離を推定する手がかりになります。

ただ、小さく写った理由が「遠くにいるから」なのか、「もともと顔が小さいから」なのかは、画像の大きさだけでは決まりません。絶対的な距離を出すには、実際の大きさなど、追加の手がかりが必要です。

そこでTrueDepthは、自分で分かっている模様を、顔に投影します。 Appleの説明では、数千の赤外線の点を投影・解析して、顔の深度マップを作ります。赤外線なので、目には見えません。Apple:Face IDの先進のテクノロジー

決まった模様を投影し、その見え方から奥行きを求める方式を構造化光と呼びます。TrueDepthは、その投影器と赤外線カメラを組み合わせています。距離が分かる理由を、まずは点1個で見てみましょう。Apple:カメラの技術資料

2つの方向が分かると、点の場所が決まる

カメラは、光の点が画像のどこに写ったかから、その点が見える方向を割り出せます。 そのカメラを投影器から少し離して置くと、2つの情報がそろいます。

  1. 投影器には、その点を「どの方向に出したか」が分かる。
  2. カメラには、その点が「どの方向に見えたか」が分かる。
  3. 2本の線が交わる場所が、光が顔に当たった位置。
投影器から伸びる光の線だけでは位置を決められないが、カメラから見る線を重ねると交点に位置が決まる図
「この線上にある」という情報を2つ重ねると、「ここにある」へ変わります。

投影器とカメラの間隔は分かっているので、この三角形から実際の距離も求められます。これが三角測量です。TI:構造化光と三角測量

これをたくさんの点で行うと、鼻や頬の凹凸が分かり、顔の深度マップになります。自分で赤外線を出すので、暗い場所でも使える仕組みです。Apple:Face IDのしくみ

もっと詳しく:画素から角度が分かる理由と、動かせる実験

「物体・レンズ・撮像面」の3つで考える

まず見るのは、観察している物体上の点、カメラのレンズ、その後ろの撮像面です。撮像面は、CCDやCMOSなどのセンサーで光を受ける平らな面。画素が縦横に並んでいます。下の図は横から見た断面なので、撮像面が縦の線に見えています。

物体の測定点 P から来た光が、レンズを通り、撮像面の画素 p に像を結びます。図では、単純化したレンズの光学中心を通る代表の1本を描きました。中心より上にある点の像が、撮像面では中心より下にできることが分かります。

物体上の測定点、レンズ、平らな撮像面の3つを並べた図。測定点からレンズの中心を通る光が、撮像面の中央からずれた画素へ届く。
カメラを横から見た断面図です。右は光を出す装置ではなく、光を受ける撮像面。左の物体から来た光が、右の画素へ届きます。

今度は、図を逆にたどります。カメラには「どの画素に光が落ちたか」が分かっています。 その画素とレンズの光学中心を結び、物体側へ線を延ばす。この線が、点を見る方向です。カメラの真正面を示す破線との角度が θ になります。

撮像面だけなら、分かるのは画素の位置。でも、レンズとの位置関係が分かっているので、中央からのずれが大きければ、見る方向も斜めになると計算できます。実際のカメラでは、校正したレンズの情報を使ってこの対応を求めます。

計算の材料は、**「中央から何画素ずれたか」と「カメラの焦点距離」**です。厳密には中央そのものではなく、校正で分かる「主点」を基準にします。

焦点距離も画素と同じ単位に換算しておけば、例えば「焦点距離1,000画素相当・中央から100画素ずれた」なら、tan θ = 100 ÷ 1,000 = 0.1。そこから θ ≒ 5.71度 と求まります。この数字は説明用で、iPhoneの仕様値ではありません。

図はレンズの働きを単純化したものです。レンズのゆがみなどを補正し、校正した値を使って、画素と見る方向を対応させます。AppleのARKitにも、焦点距離と主点を画素単位で表したカメラの情報が用意されています。Apple:カメラの内部パラメータ

角度から距離を求めてみる

例えば、紙の上に投影器とカメラを2 cm離して描きます。投影器から真正面に線を引き、カメラからは内側へ約5.71度傾けた線を引く。すると2本は、端末の位置から前方20 cmのところで交わります。顔の大きさを知らなくても、実際の長さが分かっている2 cmを物差しにして、奥行きまで求められるのです。

底辺2 cmに対して、高さは20 cm。実際には、このくらい細長い三角形です。破線はカメラの真正面を示します。
底辺2 cmに対して、高さは20 cm。実際には、このくらい細長い三角形です。破線はカメラの真正面を示します。

投影器とカメラが同じ向きで、点を真正面に投影する単純な配置なら、式は次のようになります。

奥行き = 投影器とカメラの間隔 ÷ tan(カメラから見た角度)

下のスライダーで、距離と角度の関係を試せます。寸法は説明用で、iPhoneの仕様値ではありません。

OPTICS LAB / 01面を動かすと、見える角度が変わる。
端末を上から見た図 面まで 30 cm 投影器カメラ 光の方向は固定 見る角度が変わる

カメラから見た角度 3.81°

スライダーで試す:近いほど、角度が大きくなります。間隔を仮に2 cmとした単純モデル。図では間隔を強調しています。iPhoneの実寸や実測値ではありません。

ここで説明したのは構造化光の一般原理です。実際には、写った点と投影した模様の対応づけや補正も必要で、TrueDepth内部の処理すべてを再現したものではありません。TI:構造化光の処理手順

奥行きの情報を、腕立ての「1回」へ

顔の立体的な情報をアプリが最初から解析する必要はありません。ARKitが顔の3D位置を返し、腕鍛帳はその位置から距離を計算します。Apple:ARFaceAnchor

腕鍛帳では、最近の動きから、腕を伸ばして顔が離れた位置を基準にします。そこから一定の割合だけ近づくと「下げた」と判断し、再び基準に近い距離へ戻ると1回です。

顔までの距離が遠い状態から近くなり、再び遠い状態へ戻ったときに1回を数えるグラフ
「下げた」と「戻った」の判定を分けて、ひと往復を捉えます。

近づいただけでは、まだ半分。下げて、戻すまでを見届ける。 センサーで得た距離と、動きの順序を読むアプリの処理が組み合わさって、カウントになります。細かな揺れですぐ次の回数にならないよう、カウント間隔にも制限を設けています。

固定の「床から何cm」だけで決めず、自分の動きの基準に対する変化を使うのも、腕鍛帳の工夫です。ただし、顔が画面から外れたり、端末が動いたりすると計測に影響します。顔の動きを数える仕組みなので、全身のフォームの正しさまで保証するものではありません。

どのiPhoneで使われている?

TrueDepthは2017年のiPhone Xから搭載され、Face ID対応のiPhoneに使われています。iPhone SEシリーズには搭載されていません。16eや17eはFace ID対応です。Apple:対応機種一覧

対応するTrueDepth非搭載端末でも、ARKitは顔の3D位置を返せます。ただし、センサーで取得した深度データはTrueDepth搭載端末に限られます。腕鍛帳の対応するSEでは顔の位置推定を利用しますが、同じ測定条件や精度だとは限りません。Apple:ARKit 4の解説

いつもの顔認証が、今日のひと押しを支える

普段は画面のロックを解除してくれる仕組みが、床に置くと、腕立ての動きを捉える手がかりになる。その奥では、目に見えない点と、小さな三角形が働いています。

腕鍛帳では、重ねた腕立てが百人一首の文字を一字ずつ進めます。計測の先にある楽しみは、「一首ずつ、日本の情景を集める」で紹介しています。置き方や操作については、よくある質問へ。

次にiPhoneの前で体を下げるとき、顔の上の見えない目印を、ちょっと想像してみてください。

腕鍛帳

鍛錬を重ねて、一首ずつ自分の絵札に

腕立ての自動カウントと、情景から楽しむ百人一首。腕鍛帳の機能をご紹介します。