MetashapeのPython APIメモ | 山口大学 空中測量(UAV写真測量)研究室の技術ノート

山口大学 空中測量(UAV写真測量)研究室の技術ノート

UAV写真測量, ドローン測量, フォトグラメトリ, SfMなどと呼ばれる技術の情報を掲載します。
1. 効率化・高精度化に関する研究速報・マニュアル
2. SfM/MVSソフトAgisoft Metashapeの使い方
などなど。

※「ブログトップ」の注意・免責事項からご覧ください。

【このテーマでは、きちんと記事にまとめる暇のない、速報的なメモ書きを掲載します。】

 

【イントロ】

MetashapeのPython APIは、通常の写真測量フローを自動化するだけでなく、様々な設定の組み合わせで精度を評価するなどの研究用途にも有用です。しかし、マニュアル (Metashape Python Reference)が簡潔であることや、クラスの構成の特徴?により、GUIやレポートに表示される精度情報(誤差の統計量など)を数値で取得しようとするだけでもなかなか大変です。

 

例えば、

  • あるマーカーに関する座標推定の誤差をmarker.errorで簡単ゲット!は出来ません。Markerクラスにそんなプロパティはないため、自分でベクトルの引き算をして計算する必要があります。しかも推定座標marker.positionと実測座標marker.reference.locationは座標系が異なる!ため、自力で座標変換をしてから引き算する必要があります。
  • 疎な点群の再投影誤差RMSをchunk.rms_reprojection_errorで簡単ゲット!は出来ません。Chunkクラスにそのようなプロパティはないため、自力で個々の点の個々のカメラにおける再投影誤差を取得して集計する必要があります。

MetashapeのPython APIについて、日本語で記した公開ページは検索で見つけられませんでしたので、私がこれまでrepeatSfMを作る際などに、Agisoft Forumの検索や試行錯誤で得た知見をメモします。

国内のMetashape解析の自動化の一助になれば幸いです。

 

【メモ (ver 1.5.5時点)

  • マニュアルの記述は簡潔で、それぞれのプロパティの座標系など細かいことは書かれていない。
  • 最大の情報ソースはAgisoft Forumらしい。Agisoft Technical Supportの方の投稿を含め、様々なサンプルコードが貼られている。
  • Python APIに登場する3次元座標系には少なくとも4種類あり、①現在のChunkに設定された座標系(地理座標系、投影座標系、または地球楕円体と紐付けられていない局所的な直交座標系)②地心座標系 (geocentric coordinate system)③内部座標系 (internal coordinate system)、そして④局所的な直交座標系 (LSE: Local Space Euclidean)、である。日本語は私の勝手な訳で、英語はマニュアルやAgisoft Forumで使われている表現。それぞれのプロパティ・関数がどの座標系を扱うのか、マニュアルには明示されていないことも多い。
  • 以下、chunk, marker, cameraをそれぞれ、(Metashape.)Chunk, Marker, Cameraクラスのオブジェクト(インスタンス)とする。
  • camera.centerとmarker.positionプロパティは、内部座標系③における撮影位置・マーカーの推定座標を返すので、通常はchunk.transform.matrix.mulp関数で地心座標系②に直して使う。
  • camera.reference.locationとmarker.reference.locationプロパティは、Chunk座標系①における座標を返す。
  • chunk.crs.project関数で、地心座標系②からChunk座標系①への変換が出来る。
  • chunk.crs.unproject関数で、Chunk座標系①から地心座標系②への変換が出来る。
  • Metashapeの座標データペインやレポート表示される3次元座標の誤差(通常:m単位)は、少なくともChunk座標系が地理座標系の時には、局所直交座標系④における誤差である。これをPython APIで再現するには、chunk.crs.localframe関数により、地心座標系②から局所直交座標系④への変換行列を取得して、地心座標系で計算した誤差ベクトルに掛ける必要がある。
  • Chunk座標系①に局所直交座標系④が設定されているときは、①=④であり、当然ながらchunk.crs.localframe関数は単位行列を返す。
  • marker.projections[camera].coordは、画像cameraにおけるmarkerの登録位置(マーカー検出 and/or 手作業で同定された2次元の画素座標)を表す。これを再投影位置camera.project(marker.position) と比較することで、markerのcameraにおける再投影誤差が得られる。
  • 後方互換性は保証されず、バージョンアップ時にプロパティなどが改名されることもある。以上の情報は特定のバージョンにおけるものに過ぎない。