画像から3次元データを復元する技術の調査　(1)概要 


#このシリーズについて
カメラをつかって三次元情報を復元する技術について調査したことを個人的な備忘録としてまとめる。
なお、筆者は勉強している段階なので違っているところがあれば指摘してもらえると助かる。
とくに、ＭＶＳの処理に関心があるので、最終的にはMVSの各手法を原理レベルで記載したい。

#はじめに
このページでは、三次元の復元処理に関する概要を記載する。
自分のメモのために書いている意味合いがとても大きいのでわかりにくいことがあったら申し訳ない。


#カメラについて
カメラによってアプローチの方法やメリットデメリットが異なる。
以下に知ってる範囲で記載した。

####（１）LiDARカメラ・ミリ波レーダー
不可視の”電磁波”を飛ばして物体の距離を測定＆三次元座標を直接計る。
LiDARでは赤外線(10μm)、ミリ波では(10cm-1mm)の電磁波を飛ばす。レーザーかっこいい。

実例としては、自動車の天辺につけて自動運転のための物体検知に使われたりする。
高精度を求めるだけなら一番の選択ではなかろうか。
<img width="300" alt="a02.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/a21ad886-1528-ee08-9f9a-b9996f9178db.jpeg">

ただ、これらのカメラはレーザーを飛ばしてその反射を測定することを基本としているので、
物体によっては検知率が下がる場合もある。例えば、黒い素材だと光を吸収してしまって検知できなかったり、
電波の反射率が低い段ボールがミリ波では測定しづらかったりする。

また、ここではLiDARとミリ波を一緒くたにしているけど、それぞれにメリットデメリットがある。
どちらを選択するかは用途に合わせて考えるべき問題と思われる。

<img width="300" alt="pointcloud.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/9a823da7-91ce-e633-b58a-243348eca690.jpeg">

・・・と色々書いたが、物体や暗さに左右されないのでやはりめちゃつよ。ROSにおいてはコストを無視すれば無敵。
使ってみたいなーと思うけど、自動車につけるような高精度のものは数千～数万ドルレベルである。
庶民でも買えそうなレベルの物を以下に列挙した。
######〇RealSense。
LiDARカメラでは評判良くて比較的安価。価格は２万～３万
https://www.amazon.co.jp/intel-RealSense%E2%84%A2-Depth-Camera-D435/dp/B07BLS5477


######〇Kinect。赤外線を利用したカメラ。
マイクロソフトがゲームのコントローラとして発売。2010年前半あたりではすごく人気だった。
kinect v1,v2と２つあるけど2017年に生産終了。中古でしか買えない。
でも2019年に「Azure Kinect AI」として再び復活。Azure Kinect AIは複数のマイクもついてるから、
音源分離とか音声の分野でも利用できたりするのかな？ゲーム目的じゃなく、研究目的っぽいからすごく良さそう。
なお日本ではまだ発売されてない模様。価格は４万くらい。

####（２）ステレオカメラ
2つのカメラが定位置にくっついてる。
カメラ間の距離と２つの画像の視差を利用して点群データを作成する。
![mynteye_s_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/8b8c0a9d-38ed-0972-dd45-c46d9e7defa7.jpeg)

既知の情報が豊富であるため、単眼カメラと比べると精度はたかい。
単眼カメラに用いられる原理も適用できるので強い。

一方で、（１）のカメラと比べると精度は若干劣るイメージがある。
ただ、ステレオカメラによる三角測量はピクセルの視差を測定するため、
解像度がめちゃくちゃ高い写真であれば精度は（１）に匹敵するのかもしれない。

そしてなにより、最大のメリットは安さと精度の兼ね合い。
（１）と比べるとめちゃ安い。ついでに自作しようと思えば普通のカメラでも可能である。
加えて、（１）のカメラは物体の素材に依存して精度が下がる場合が存在するが、
ステレオカメラはそんなもの関係なしなので、そういう意味では強い。

キーワード：三角測量、エピポーラ線

####（３）単眼カメラ
よくあるカメラ。みんなもってる普通のカメラ。個人的には特に重点を置きたいカメラ。
大きなメリットとしては、誰でも持ってるカメラでも復元可能なこと。
理論的にはネットのそのへんに落ちてる動画からでも復元できる。理論的には。

キーワード：SfM、SLAM、MVS


#画像を三次元上に復元する処理の概要
####（１）SLAM or SfM
SLAM/SfMでは、多視点のカメラ画像を用いて「疎らな点群データ」を作成する。
疎らとは、文字通りまばらでスカスカな点群データのことを指す。
画像の特徴点をそのまま三次元座標にしたようなものでしかないので、本当にスカスカである。
![sfm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/60429b0e-81e5-0c53-4d47-b57ca0e21b1f.png)

完成された点群データを作成するには、
一般的には後の工程で行われるMVS（以降の項で説明）の処理が必要。
MVSでは点群の密度を増やし「密な点群データ」を作成する。

ここまでの説明だけ見れば、最初からMVSだけ行えばよいと思いそうになる。
しかしSLAM/SfMの最大の目的は、疎らな点群を作ることが目的ではない。
写真が撮影されたときの「カメラの姿勢」を推定することが最大の目的である。


######※「カメラの姿勢」
意味合いとしては、カメラ自身の情報とカメラの位置・向きのことを指す。
用語で言えば、内部パラメータ・外部パラメータ。

内部パラメータ・外部パラメータを用いることで様々な情報を計算できる。
非常に応用が利くので、MVSにおいてはとても重要なパラメータである。
（たとえば、画像上の二次元座標を三次元座標に変換したり、
あるいはある画像の座標が別の画像ではどのピクセルに位置するか計算したり等。）


以下に、SLAM/SfMのそれぞれの概要について記載した。

####（１－１） SLAM
とにかく計算が早い。でも低精度なイメージ。
処理が速いので、ロボットで障害物が目の前にあるかどうか判断するのに活用されたりする。
近年では機械学習を組み込んだものも出てきていて、速度と同様に精度のほうもあがってるのかもしれない（未調査）
![ts_980roomba04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/746b3916-10c8-6861-d0ae-29c128e65fb9.jpeg)

↓リアルタイムでカメラ姿勢を推定する例
https://www.youtube.com/watch?v=8DISRmsO2YQ
↓SLAMのオープンソースをまとめたリンク集
https://github.com/tzutalin/awesome-visual-slam



####（１－２） SfM
SLAMとよく対比させられる処理。SLAMに対してこちらは高精度に低速度なイメージ。
速度よりも精度を求めるならこっちのほうが良い。……と、私は信じてる。
でも最近の研究ではもしかしたらSlamもsfmも遜色ないのかもしれない。未調査である。

実例のひとつとして、UAV（ドローン等）でSfMを行うことで広域を３Ｄ化させたりする。
![612lueoUvQL._AC_SX425_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/d0ac7bf4-a03e-381c-9f5e-04408416934e.jpeg)

また、世界遺産などの景観をデータ化するのにも利用される。
SfMは理論的にはどのような画像でも利用できるため、ローマのコロッセオをインターネット上の画像で復元した例も存在する。
日本で言えば、昨年全焼した首里城の３Ｄ化が行われた。以下のサイトに３Ｄが公開されているので
興味のある人は参考にしてください。
<img width="500" alt="syuri.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/e23c83ea-ec0a-bedf-5bf6-93e95da8cf32.png">
https://www.our-shurijo.org/





ＳｆＭは昔から研究されているテーマなので、いろんなオープンソースが存在する。
メジャーどころなオープンソースとしては、
OpenMVG、VisualSFM、COLMAP、Theia、Bundlerなどがある。

↓参考資料
https://www.mdpi.com/2313-433X/4/8/98/pdf
"Evaluating the Performance of Structure from Motion Pipelines"

上記の資料では各オープンソースの中身と結果を比較している。
どのオープンソースを使うか悩んでいるひとは参考になるかもしれない。
5/18ページに各オープンソースが採用しているアルゴリズム、
13/18ページに各オープンソースの復元例があるので興味のある人はどうぞ。

個人的な所感としては、OpenMVG・Colmap・Theiaは比較的新しい。
OpenMVGはビルドが簡単。Colmapは出来合いの実行ファイルが配布されてるからすぐ使える。
けどColmapは処理によってはGPUが必須だったりする。また、GPU使ってるけどそんなに早くない。
でもいろんな論文で比較対象として頻繁に取り上げられるから、評判はとてもよい。
VisualSfMはよく名前は聞くけど商用不可だから調べてない。
OpenMVG・Colmapはコマンド一発で簡単だけど、Theiaはライブラリだから自分で組まないといけなさそう。


また、有償のサービスもある。
写真から３Ｄのデータを作成するのは一定の需要があるようである。
「フォトグラメトリ」で検索すると色々出てくるので興味ある人はどうぞ。めちゃくちゃ精度高い。

↓有償サービスの一例。Reality Capture
<img width="600" alt="fab.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/04de82ea-7b67-acdb-8f77-bc5da2459357.png">
https://sketchfab.com/3d-models/sculpture-cumil-bratislava-4fb4fd2a5d4341bf991d74c207e5de7d

余談だが、SfMと一言で言っても
Incremental SfM、Global SfM、HSfMと種類が色々ある。
筆者が必要になった際、これらのアルゴリズムの特徴を改めて勉強し、
その備忘録としてまたここに記載する、かもしれないししないかもしれない。

####（２）AIを用いた復元
機械学習による復元。事前に任意の視点の画像と３Ｄ形状を学習させることで、単眼カメラの画像でも高速で復元できる。
人の表情、スポーツのポーズ等、復元するものが事前に決まっているなら
DeepLearning効果で処理も早いだろうし有用と思われる。

<img width="600" alt="1_aBkwnNXRtV-C5-uIiZeuDg.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/0bd8723d-8663-838d-52b6-acc56b0df73c.png">

↓オープンソースのリンク集
https://github.com/timzhang642/3D-Machine-Learning




####（３）MVS
疎らな点群データを作成する処理としてSLAMとSfMをあげた。
MVSでは、SLAM/SfMで計算された情報をもとに点の密度を向上させる処理が行われる。
![mvs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581710/90770343-6978-4a83-1c17-de71a8581346.png)

有名なオープンソースとしては、PMVS、COLMAP、OpenMVSなど。

MVSと一言でいってもいくつかの手法があり、
小さなパッチを地道に当てていったり、PatchMatchを利用してデプスマップを算出したりと色々ある。
個人的には、MVSの処理が最終的な点群データの精度に影響してくるのかなぁ、と思っている。
いつか具体的な計算も含めて細かく検証したい。

↓facebookが髪一本一本を復元したやつ。すごい。
http://openaccess.thecvf.com/content_CVPR_2019/papers/Nam_Strand-Accurate_Multi-View_Hair_Capture_CVPR_2019_paper.pdf