Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

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

282 visualizaciones

Publicado el

XR Kaigi 2020
コミュニティオーガナイズドセッション HoloLens Meetup 編
セッション資料

https://xrkaigi.com/2020/session/99rt941uiaeb.html

Publicado en: Tecnología
  • Inicia sesión para ver los comentarios

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

  1. 1. XR DEVELOPERなら知っておきたいカメラの基礎知識 前本 知志(Microsoft MVP for Windows Development) @peugeot106s16 株式会社ホロラボ 株式会社システムフレンド 一般社団法人T.M.C.N
  2. 2. ・株式会社ホロラボ 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
  3. 3. 普段はグローバルなチームで xR関係のSDK(カメラ系)を作る仕事をしています
  4. 4. 疲れた時の息抜きはおばかアプリ開発 https://youtu.be/rbhTDwQFsNY
  5. 5. AGENDA 1. AR(MR)とカメラとUnity 2. カメラパラメータがわかっている場合 3. カメラパラメータがわかっていない場合 4
  6. 6. 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
  7. 7. カメラパラメータとは6 • 外部パラメータ (External Parameter / Extrinsics) • カメラとカメラの相対位置(RotationとTranslation)を定義 • 複数カメラ、複数デバイスの空間シェアでは良く出てくるもの • 今日は触れません • 内部パラメータ (Internal Parameter / Intrinsics) • カメラの視野角、光学中心、歪み等を定義 • 映像として綺麗に合わせるために重要 • 今日の話題
  8. 8. カメラパラメータが異なると…7 • Unity内に二つのカメラを置きシミュレート • 二つのカメラは同じ位置で同じものを見る • 視野角(内部パラメータ)が異なる • 見える映像は全く異なる • 重畳しても映像はうまく重ならない 重畳
  9. 9. 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
  10. 10. 実験 1. 1.5m先の0.38mx0.25m角の物体(つまりHoloLens2の箱)を現実のカメラ (Canon EOS 5D Mark III Sensor Size=36x24mm)とUnity内の仮想カメラで 撮影し、映像を比較する 9 Z=1.5
  11. 11. 実験 1. Focal Length =35mm 10 Z=1.5
  12. 12. 1. Focal Length =70mm 実験 11
  13. 13. 1. Focal Length =105mm 実験 12
  14. 14. 13 ぴったり合った 気持ちが良い
  15. 15. 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
  16. 16. チェッカーボードを用いたキャリブレーション15 • チェッカーボードを撮影する • 状態の良い画像が多数ある方が良い • 様々な角度から撮影する • OpenCVのcalibrateCamera関数等でごにょご にょする • Internal Parameterが求まる • Internal Parameterは9つの数値リスト。 3x3の射影行列を表す • fx / fy = 焦点距離 • cx / cy = 光学中心 https://docs.opencv.org/master/d9/d0c/group__calib3d.html#ga3207604e4b1a1758aa66acb6ed5aa65d
  17. 17. 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
  18. 18. 実験 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 同じような映像が得られたら大成功!
  19. 19. 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
  20. 20. 1. UnityのCameraに適用すると! 実験 19 OpenCVキャリブ版 Physical Camera設定版 大違いじゃないけど、近いと言えば近いけど ズレてる(笑)!
  21. 21. 20 • 敗因 • 撮影枚数が少ない • 良い写真がたくさんあれば誤差が収束してゆく • 様々なアナログ要素がキャリブレーション精度を下げる • 手作りチェッカーボードの精度 • 撮影時の手ブレ • カメラのピント • ホワイトバランスのブレ • … なかなか完璧なキャリブレーションを個人レベルで行うのは難しい。。 ここを良くしてゆくのがノウハウ、チャレンジポイントですw 実験
  22. 22. 21 • 今は何でも良いソリューションが手軽に使えますが、しくみを知れば • トラブルシューティングに役立つ • 自分でしくみを作ることができる • コスパの良い知識である • 今後Unityが無くなったり、国が滅びたりしても光の性質やカメラのしくみは 簡単には変わりません。 • 単純に、知ったことを実験して確かめてゆくことは実にたのしい まとめ

×