あづみのメモ帳

iPhoneのWebカメラの挙動とセンサの仕様を調べてみた

(最終更新: )

スマホのWebカメラ上に任意の焦点距離での画角を重ねて表示するWebカメラ照準器なるものを作っている。まだ途中だし、ほとんど実用性のない概念実証に留まるツール(そのうちこっちも記事にする)であるが、できる範囲で正確にしてみようと試みた。その際、iPhoneなどのスマホのブラウザ上で取得できるWebカメラ映像の画角を正確に知る必要があった。

Webカメラをいじれるようにする

Webカメラは、getUserMedia()を実行することで使えるようになる。このとき、引数に適当な制約を書いたMediaTrackConstraintsオブジェクト(?)を渡してやると、その制約を満たすよう努力してくれる。たとえば、カメラの向き(前面or背面)、縦横比、縦横解像度などを指定することができる。

ところで、Webカメラはlocalhostかhttpsでしか使用できない。つまり、ローカルでサーバを立てられない(こともないだろうけどめんどい)iPhone上でテストしたければ、いったんサイトにデプロイするか、ローカルでhttpsできるようにしないといけない。パラメータを検証するためにいちいちデプロイし直すのはめんどいので、制約をJSON形式で自由に入力することができるWebカメラテストページを作った。getCapabilities()getSettings()の出力も雑に確認できるようにしてある。

Webカメラテストページ
Webカメラ映像取得のパラメータをいろいろいじるページです。
azumino.pages.dev

画角を比較してみる

上記のツールを用い、iPhone SE (第2世代)およびiPhone SE (第3世代)(以降単に「iPhone」とする)で挙動を検証した。

まずは背面カメラとだけ指定して表示させてみると、4:3の映像が現れた。これはOS標準アプリで静止画を撮影した際の縦横比と同じである。では、静止画と同じ範囲写っているのかというと、そうではなく、若干小さい範囲が映し出されている。

Webカメラの出力は動画なので、静止画と違うことは十分想定できた現象である。たとえばα7 IVでも、4K60pの動画を撮影する際にはAPS-Cサイズにクロップされる。では、動画撮影時と同じ画角なのかといえば、そうでもなく、それよりはだいぶ広い範囲が映っているようである。

よくわからないので要求する縦横比を変更してみる。順当に16:9(1.7777…)を指定してみるとどうだろうか。結果は、短辺方向は4:3と同じ範囲、長辺方向はより広い範囲が映った。つまり、縦方向に縮むのではなく、横方向に伸びた。当然同じ16:9な動画撮影時より広い範囲である。2:1などさらに細長くしてみると、こんどは縦方向に縮んだ。どうやら、他の縦横比の映像は、16:9の映像から切り出されているようである。なお、大小の解像度を具体的に指定しても画角は変わらなかった。

ここで奇妙なことに気づく。よく見ると、通常の静止画では映っていなかった範囲が、Webカメラの16:9の映像には含まれているのである。長辺は広く、短辺は狭くなっている。

画角を調べる

「狭く」「広く」ではよく分からないので、数値として画角を調べてみる。

原理

下図のように、撮影距離で写る範囲の画角から、角度での画角はatan(撮影距離/(画角/2))×2、35mm判換算焦点距離での画角は撮影距離×センササイズ/画角で求められる。ただし、実焦点距離は撮影距離に対し十分小さいものとし、また、35mm判のセンササイズは長辺36mm、短辺24mm、対角43.27mmである(対角はCIPA DCG-001による)。

画角と各寸法との関係

方法

床(iPhoneの水準器では水平とされた)にA3方眼紙(大学の講義で使うやつ)を貼って固定した。三脚を用意してその上に置き、iPhoneを水準器が水平を示すように固定した。これで方眼紙とイメージセンサが平行となった。

実験装置

次に、撮影距離を定規で測定した。センサの位置を厳密に知ることができず、知っていても測るのは難しいため、床からiPhoneのケース表面までの距離をなんとなく測った。その位置から動かさずに、静止画の撮影、動画中の静止画撮影、Webカメラ(16:9)のスクリーンショット撮影をした。撮影された画像の方眼紙の目盛から、長辺、短辺の画角(撮影距離で写る範囲)を測定した。

また、静止画と動画のExifデータをExifToolで表示したところ、角度と換算焦点距離が記録されていた。

結果

撮影距離は322 mmで、画角は下表のようになった。

モード長辺[mm]短辺[mm]長辺[°]対角[°]長辺[換算mm]対角[換算mm]Exif[°]Exif[換算mm]
静止画38529161.773.730.128.965.528.0
動画35219957.364.232.934.555.834.0
Webカメラ40222663.971.228.830.2

なお、レンズ補正により画角が大きく変動する可能性を考え、静止画についてはRAW撮影も行ったが、画角に違いはなかった。

動画の画角
静止画の画角
Webカメラの画角

考察

画角65.5°、焦点距離28.0 mmのときのセンサ上での長さは、28 × tan(65.5° / 2) × 2 = 36.0 mmである。55.8°、34.0 mmでも同様に36.0 mmである。したがって、Exifの画角は長辺を基準としていると考えられる。

長辺の画角が実際にExif通りであった場合に期待される撮影面の画角は、撮影距離 × tan(画角 / 2) × 2で求めることができ、65.5°では414 mm、55.8°では341 mmである。実際にはこれより29 mm大きかったり11 mm小さかったりしている。

まず、iPhoneと床とが正確に平行になっていないことで差異が生じた可能性を考える。傾いているときの撮影面での画角は、角度での画角を用いて撮影距離 × (tan(画角 / 2 + 傾き) + tan(画角 / 2 - 傾き))で求めることができる。2°傾いていたと仮定しても415 mmと1 mmしか差がない。2°であっても十分水準器で分かるはずなので、29 mmもの誤差を生じる要因としては考えにくい。

次に、撮影距離が不正確であるために差が生じた可能性を考える。画角65.5°で385 mmの長さが見えるような撮影距離は、385 / 2 / tan(65.5° / 2) = 299 mmである。しかし、iPhoneと床との距離は、少なくとも30 cmものさしが余裕で入る程度には開いていたため、300 mmを下回るというのはありえない。

以上より、測定結果とExifの値は、誤差の範囲を超えて矛盾していると言える。

センサが余ってる?

ところで、Webカメラで静止画に含まれない範囲を取得できるということは、静止画撮影時にセンサ全域を使いきっていないということである。iPhoneに搭載されているとされるIMX315イメージセンサの大きさは、Wikipediaから消し飛ばされた表によれば対角で6.15mm、1/2.93インチとの記載があるが、1/2.93インチ=8.67mmであり一致していない。この部分に出典は示されておらず、また、ほかに信頼できる情報を見つけることはできなかった。とりあえず縦横比が4:3であると仮定すると、それぞれの長辺、短辺の大きさは下表のようになる。

像のセンサ上での大きさは、撮影面での大きさ×実焦点距離/撮影距離で求められる。Exifによれば、iPhoneのレンズの実焦点距離は3.99mmである。上記の実験結果とあわせて計算すると、使用されているセンサの領域は下表のようになる。

長辺[mm]短辺[mm]
対角6.15mm4.923.69
対角8.67mm6.945.20
静止画4.773.61
動画4.362.47
Webカメラ4.982.80

実測値の各方向の最大値を見ると、対角8.67mmに対しては小さすぎる。対角6.15mmに対しては、長辺が若干はみ出し、短辺が若干余っている。まさかと思って使用されている領域の対角線長を計算してみると——√(4.98^2 + 3.61^2)=6.15mm。ぴったりではないか。

つまり、iPhoneのイメージセンサは、縦横比4.98/3.61=1.38、対角線長6.15mmである可能性が高い。また、これにより上記の実測した画角も信用できるものと言えるかもしれない。

4:3撮影時にセンサがわずかに余っているというのもまた事実なので、たとえば3:2の写真を撮りたいとき(4:3が嫌いなので3:2で撮れるM Cameraを愛用している)、4:3から上下を切り抜くのではなく、イメージサークルに対角線を合わせて縦に小さく、横に大きく撮れればいいのになとも思う。

まとめ

iPhone SE (第3世代)、iPhone SE (第2世代)において以下が言える。

確実に言えること

可能性の高い推測

照準器として使う分には、実際30mmであるものを誤って28mmと入力しても、実際より狭い範囲が画角として表示されるので、問題ないといえる(広くなってしまっていたら問題だった)。SE以外のiPhoneやAndroid端末がどうかは分からないので、もし使いたい人がいるのなら各自で画角を測るかExifを信じるかする必要がある。

あとがき

なんか写真研究部みたいな記事だった。

参考