XR DEVELOPERなら知っておきたいカメラの基礎知識
前本 知志(Microsoft MVP for Windows Development)
@peugeot106s16
株式会社ホロラボ
株式会社システムフレンド
一般社団法人T.M.C.N
・株式会社ホロラボ Co-founder(共同創設者)
http://hololab.co.jp/
・TMCN (Tokyo MotionControl Network) Co-founder(共同創設者)
https://www.facebook.com/TokyoMotioncontrolNetwork
・著書「Intel RealSense SDK センサープログラミング」
https://www.shoeisha.co.jp/book/detail/9784798139630
・Microsoft MVP for Windows Development 2016~
https://mvp.microsoft.com/ja-jp/PublicProfile/5002154?fullName=Satoshi%20%20Maemoto
前本 知志
1
http://satoshi-maemoto.hatenablog.com/
@peugeot106s16
maemoto@hololab.co.jp
普段はグローバルなチームで
xR関係のSDK(カメラ系)を作る仕事をしています
疲れた時の息抜きはおばかアプリ開発
https://youtu.be/rbhTDwQFsNY
AGENDA
1. AR(MR)とカメラとUnity
2. カメラパラメータがわかっている場合
3. カメラパラメータがわかっていない場合
4
1.AR(MR)とカメラとUNITY
1. AR(MR)アプリの重要な機能は、現実空間にCGを重畳表示することである
2. AR(MR)アプリのメインインプットソースは、現実空間を見ているカメラの映像、またはそ
れを処理したデータである
3. 現実空間にCGを重畳表示するとは、「現実空間を見ているカメラ」と「Unity内の仮想
Camera」の映像を重ね合わせることである
4. そのために必要な事
1. とある共通の空間原点を定義し、同じ座標軸で二つのカメラの回転(Rotation)と移動量
(Translation)を合わせる
2. 二つのカメラの視野角、光学中心、歪み等を揃える ※今日の話題はこちら
これらはVuforia, ARKit, ARCoreといったARエンジンがおまかせでやってくれることです
しかしおまかせではいつまでたっても俺ARエンジンは作れません!(需要は知らん
5
カメラパラメータとは6
• 外部パラメータ (External Parameter / Extrinsics)
• カメラとカメラの相対位置(RotationとTranslation)を定義
• 複数カメラ、複数デバイスの空間シェアでは良く出てくるもの
• 今日は触れません
• 内部パラメータ (Internal Parameter / Intrinsics)
• カメラの視野角、光学中心、歪み等を定義
• 映像として綺麗に合わせるために重要
• 今日の話題
カメラパラメータが異なると…7
• Unity内に二つのカメラを置きシミュレート
• 二つのカメラは同じ位置で同じものを見る
• 視野角(内部パラメータ)が異なる
• 見える映像は全く異なる
• 重畳しても映像はうまく重ならない
重畳
1.カメラパラメータがわかっている場合
1. 1眼レフ等Specとしてカメラパラメータがわかっている場合は、Unity Camera
にその値を設定すればちゃんと映像が合います
1. Camera.Physical Camera をtrueにし、下記を現実のカメラと同じ値にする
2. Focal Length (焦点距離)
3. Sensor Size (イメージセンサーの大きさ)
8
https://docs.unity3d.com/ja/2018.4/Manual/PhysicalCameras.html
実験
1. 1.5m先の0.38mx0.25m角の物体(つまりHoloLens2の箱)を現実のカメラ
(Canon EOS 5D Mark III Sensor Size=36x24mm)とUnity内の仮想カメラで
撮影し、映像を比較する
9
Z=1.5
実験
1. Focal Length =35mm
10
Z=1.5
1. Focal Length =70mm
実験
11
1. Focal Length =105mm
実験
12
13
ぴったり合った
気持ちが良い
2.カメラパラメータがわかっていない場合
1. 大抵のカメラSDKにはIntrinsicsを取得できるAPIやToolがあります。
1. 例えばAzure Kinect
https://microsoft.github.io/Azure-Kinect-Sensor-
SDK/master/structk4a__calibration__intrinsic__parameters__t_1_1__param.html
2. APIが無い、値が信用できない場合はOpenCVを使用してカメラパラメータを求
める(皆さんおなじみの(?)チェッカーボードを使うもの)
https://docs.opencv.org/master/dc/dbb/tutorial_py_calibration.html
こちらの記事はとても参考になります!
https://kamino.hatenablog.com/entry/opencv_calibrate_camera
3. IntrinsicsをProjection Matrixに変換してUnityのCameraに設定する
Intrinsicsはリアルカメラのパラメータとは表現が異なるので、直接Inspectorから設定できま
せん。射影行列へ変換することが必要です。
https://kamino.hatenablog.com/entry/unity-import-opencv-camera-params
14
チェッカーボードを用いたキャリブレーション15
• チェッカーボードを撮影する
• 状態の良い画像が多数ある方が良い
• 様々な角度から撮影する
• OpenCVのcalibrateCamera関数等でごにょご
にょする
• Internal Parameterが求まる
• Internal Parameterは9つの数値リスト。
3x3の射影行列を表す
• fx / fy = 焦点距離
• cx / cy = 光学中心
https://docs.opencv.org/master/d9/d0c/group__calib3d.html#ga3207604e4b1a1758aa66acb6ed5aa65d
UNITYのカメラに適用する16
• UnityのCameraに射影行列を反映する
• Inspectorからは適用できない
• FoVをWidth,Hight個別に設定できない、など射影行列の表現を全て正確に設定することができないため
• Camera.projectionMatrixにMatrix3x3として設定を行う
• https://docs.unity3d.com/ja/2019.4/ScriptReference/Camera-projectionMatrix.html
• これを行うとInspectorの設定は無効になるので注意
• UnityなのにOpenGL座標系になる
• (難しいけれど、3Dグラフィックスちょっとできる気になれる)
• このスクリプトを使わせてもらうのが良いw
• https://github.com/kamino410/cv-
snippets/blob/master/unity/OpenCVCameraParams.cs
実験
1. 1.5m先のチェッカーボードを現実のカメラ(Canon EOS 5D Mark III Focal Length =70mm)
で撮影し、OpenCVでInternal Parameterを求める。
2. 求めたパラメータを設定したUnity内の仮想カメラの映像と、Physical Cameraの実験で得た
Focal Length =70mmの映像を比較する
17
Z=1.5
同じような映像が得られたら大成功!
1. Focal Length =70mm
2. 15枚の画像をOpenCVで処理
3. 求まったパラメータ
1. 1.0501518959042742e+04, 0, 2.2964267305726362e
2. 0,1.0498208083522914e+04, 2.0191220772892598e+03
3. 0, 0, 1
実験
18
1. UnityのCameraに適用すると!
実験
19
OpenCVキャリブ版 Physical Camera設定版
大違いじゃないけど、近いと言えば近いけど
ズレてる(笑)!
20
• 敗因
• 撮影枚数が少ない
• 良い写真がたくさんあれば誤差が収束してゆく
• 様々なアナログ要素がキャリブレーション精度を下げる
• 手作りチェッカーボードの精度
• 撮影時の手ブレ
• カメラのピント
• ホワイトバランスのブレ
• …
なかなか完璧なキャリブレーションを個人レベルで行うのは難しい。。
ここを良くしてゆくのがノウハウ、チャレンジポイントですw
実験
21
• 今は何でも良いソリューションが手軽に使えますが、しくみを知れば
• トラブルシューティングに役立つ
• 自分でしくみを作ることができる
• コスパの良い知識である
• 今後Unityが無くなったり、国が滅びたりしても光の性質やカメラのしくみは
簡単には変わりません。
• 単純に、知ったことを実験して確かめてゆくことは実にたのしい
まとめ
xR Developerなら知っておきたいカメラの基礎知識

xR Developerなら知っておきたいカメラの基礎知識