他にも多く書かれている方がいらっしゃるかと思いますが,備忘録的な意味を込めて書いておきます.
使用機材
- ドローン:DJI Mavic Air 2 あるいは DJI Mini 3 Pro
- Mini 3 Pro のみ SRTファイルが生成される
- このSRTファイル中には緯度経度高度の情報が入力されている
- ない場合は携帯端末(iPhoneやAndroid)からFlightlogを抽出する必要がある
- どうやらDJI SDKの対応バージョンの違いによるものか
- Mini 3 Pro のみ SRTファイルが生成される
- 360度カメラ:Insta360 ONE RS 1-Inch 360 Edition
- レンズが文字通り飛び出ているため,ハードウェアケースやレンズカバーを付けたいがスティッチングに悪影響があるという情報がある
- しかし処理ソフトInsta360 STUDIO 2023にはケースによる画角補正のオプションがあるので,レンズカバーによる補正はある程度後処理が可能
撮影時の注意
- ドローン
- 基本的に対象物の視差を得ることを目標に飛ばす
- 対象物のあるポイントが色々な方向から撮影されているような飛行経路やカメラアングルがベスト
- GCPを置ける,あるいはRTK-GPSを搭載したドローンを使えるのがベスト
- ただ,費用や時間の面からそれができない場合もある
- 大まかな精度を確認する目的で,リボンロッド等をおいておくと良いかもしれない
- また飛行経路は空間の3方向に均等にバラけさせたほうがよい
- 例えば斜面崩壊地の流下方向にのみドローンを飛ばした場合,流下方向の精度と比較して斜面横断方向の精度が落ちる可能性がある
- 測量の誤差論でもう少し理論的な話があるはず…
- 例えば斜面崩壊地の流下方向にのみドローンを飛ばした場合,流下方向の精度と比較して斜面横断方向の精度が落ちる可能性がある
- また同一地点での急激な回転はアライメントがうまくいかない原因になるので避ける.
- なるべく隣り合うフレームで画像のオーバーラップが高くなるように
- 空や水面をなるべく入れない
- マスクして処理をする方法があるが,なかなか大変…
- 基本的に対象物の視差を得ることを目標に飛ばす
- 全体
- 解像度は高ければ高いほうがいいけど,こればかりは財布との勝負
- 天候は曇のほうがよい
- 太陽光の反射やレンズフレアが起きにくいため
前処理
- ドローンの映像とGPSデータからExifに緯度経度高度が書かれた連続画像を生成する
- iPhoneを利用している場合は標準のFilesアプリからDJIのアプリを開くことでFllightRecordの生データを入手することができる
- ただこのデータは暗号化されているため,AirDATAなどのサイトに一旦アップロードすることで平文のログに変換する必要がある
- AirDATAのサイトからCSVをダウンロードしておく
- このCSVデータ,あるいはMini 3 Proの場合には動画と同じディレクトリに生成されるSRTファイルから,GPSタグ付きの連続写真を生成する
- 詳細な検証はしていませんが,自作のPythonコードはこちらからご確認いただけます.
- https://github.com/masamasace/DJI-Movie2Image-Geotag-Converter
- 基本的に動画で撮影している理由は災害調査などで高速でドローンを動かす必要があり,インターバル撮影では撮影対象物を取り逃す可能性があるため
- ただ画角は狭くなり,RAWデータの利用もできないため,絶対的な品質は低下する
- 標準的なドローンであれば,2秒間隔でJpeg画像が取得可能.
- フライトアプリLitchiだと,もう少し短い間隔まで設定可能
- ただLitchiは最新世代まで対応していない,また間隔までは見れていないので要確認
- 360度カメラの場合はGPSが内蔵していないため,単純にffmpeg等で出力をする必要がある
正攻法
- カメラキャリブレーションを実施する
- 実施しておくことでアライメントの時間が大幅に短縮される
- しかし360度カメラの事前キャリブレーションはできない?←要確認
- 写真をドラックアンドドロップで入れ込む
- 現在所有しているPCでは2000枚程度でも十分に解析可能→RAM 192GB
- もし多すぎる場合には複数列でアイコンを表示させるようにして,1列だけ選択すれば間引きができる
- 例えば5枚中1枚に間引きをしたいのであれば,5列表示になるようにアイコンのサイズやウインドウのサイズを変更して,カーソルで縦1列のみを選択すればよい
- ドラックアンドドロップ後にカメラのキャリブレーションデータを読み込む
- 読み込み後全てのパラメータを固定するのを忘れずに
- 360度カメラの場合には,カメラのタイプ(用語要確認)を「フレーム」から「球形」にするのを忘れずに
- RTKモジュールなどを搭載したドローンでない限りは,アライメントでGPSの情報は使わないほうが無難
- 単独測位は特に高度の精度が悪いため,アライメントに悪影響が出る可能性がある
- ちなみにDJIのドローンには,気圧計ベースの高度とGPSベースの高度の2種類が内部的に記録されている
- そのため,左下の「座標データ」のタブに飛び,ロードした写真を一括選択してチェックをはずしておく
- 単独測位は特に高度の精度が悪いため,アライメントに悪影響が出る可能性がある
- バッチで一括で回す方法もあるが,アライメントがうまく行かない状態でその後のMVSやメッシュ構築をしても意味がないので,ひとまずアライメントのみを回す
- 設定は以下の通り
- アライメントを回し終わったら,全ての写真がうまくアライメントできているかを確認する
- 全ての写真がアライン済みとなっていても,変な方角にアライメントされている場合があるため注意
- 一部の写真がうまくアライメントできていない場合
- その写真を下側の写真タブで全部選択して右クリック
- 写真の再アライメントという項目があるのでそれをクリック
- これを全ての写真がアライメントされるまでやる
- それでもうまく行かない場合には,アライメント前に自分でマーカーを打っておくこともできる?
- あるいはチャンクを分けて別々に処理して,対応するタイポイントを使って2つのチャンクを合成することも可能
裏技
- チェッカーボードを利用した事前キャリブレーションはしておいたほうがよい
- 動画の場合には、必ず各視点から撮影する際に動きを止めて静止した状態で撮影すること
- ジンバルにより平行を保とうとするため、カメラの向きを変えることで、画像画素の全ての部分にチェッカーボードが映り込んだデータにしておくこと
- 画像を読み込み、事前キャリブレーションデータを読み込み、固定する。
- カメラのアライメント時には、
reference preselection
をSource
に設定することで、ジオタグの情報を使い、かつキャリブレーションデータを使うことで、一旦アライメントを完了させ、SfMを完了させる Build Point Cloud
を実行せずに、直接Build DEM
を実行する。このとき、Source data
をTie Points
に設定し、疎なDEMを作成する- JAXAやALOSといった元地形のDEMをダウンロードする
- QGIS上で生成した疎なDEMと元DEMを重ね合わせ、
profile tool
を使って、元のDEMとの差分を可視化する。- おそらく生成されたDEMの長手方向では、ドーミングによる誤差が大きくなるはず。
- 生成されたDEMの長手方向に、地表面の特徴的な点を選択し、マーカーを複数打つ。
- これらのマーカーの標高値(とりわけ周辺部に存在するマーカーの標高値)を数m程度変化させる。
Reference
タブでCameras
のチェックをすべて外し、Markers
のチェックをすべて入れる。- こうすることで、一旦写真のGPS情報を使用せず、マーカーのみの情報を使って、かつSfMの疎点群が生成された状態で、カメラのキャリブレーションを修正することができる。
Optimize Cameras
を実行し、カメラのキャリブレーションを修正する。Update Transform
を実行し、写真と疎点群の位置を修正する。- 作成されたDEMがあれば削除する
- もう一度
Build DEM
を実行し、DEMを生成する。 - 生成されたDEMと元DEMを重ね合わせ、差分を確認する。
- これを繰り返すことで、DEMの精度を向上させることができる。
- カメラのキャリブレーションパラメータがドーミングを無視できる程度に収まった場合、
Reference
タブでCameras
のチェックを入れ、Markers
のチェックを外す。 Update Transform
を実行し、写真と疎点群の位置を修正する。Build Dense Cloud
を実行し、密な点群を生成する。Build Mesh
を実行し、メッシュを生成する。Build Texture
を実行し、テクスチャを生成する。Export
を実行し、出力する。