LoginSignup
4
2

More than 3 years have passed since last update.

【Metashape】個別画像の特定点の三次元座標を求めた~Agisoft forumを参考にPython APIから実装~

Posted at

Metashapeとは?

修士研究でドローンの画像処理をしていることもあり、Metashape(旧:Photoscan)という三次元構築ソフトウェア?を使っています。
元々個別画像で画像処理をしていて、検出した作物の位置情報を求める必要が出てきました。
事前に個別画像からモザイク画像は作成していたのですが、個別画像で求めたポイントとモザイク画像の一致点を求めることで、三次元座標を求めることが出来るのでは?という仮説のもと、進めました。

Metashape Python APIを理解するのは大変です

MetashapeにはPython APIがあり、ソフトで実装されていない機能などはPythonでコードを書くことで実行することが出来ます。
しかし、Metashapeを使っている人やPython APIを使っている人が少ないのか、日本語で検索してもなかなか情報がありません。

例えば、山口大学の空中測量研究室のブログには日本語で唯一ともいえる程、Metashapeに関する情報が載っています。
MetashapeのPython APIメモ

おそらく、あとは英語による情報収集になるでしょう。
Metashape公式のAPI解説では、200ページ近い説明書があり、これを参考にしながらコードを書くことになります。

Metashape Python Reference Release 1.6.0

しかし、この説明書は説明がなかなか単純化されていて、目の前のトラブルを解決するには情報が不足しています。不親切ですね。
その代わり、Agisoft forumという質問コーナーにナレッジが蓄積されており、非常に参考になります。

以上のサイトを参考にしながら、試行錯誤していくことになります。

解決方法

やろうとしたことを整理すると、
モザイク化する前の画像における座標:[x,y]
から
3次元座標:[X,Y,Z]
を取得したい!ということです。
以下の記事を参考にして、実現しました。

How to add marker using camera's coordinates.

script.py
import Metashape 
doc = Metashape.app.document
chunk = doc.chunk
camera = chunk.cameras[N]
surface = chunk.model
point = surface.pickPoint(camera.center, camera.transform.mulp(camera.sensor.calibration.unproject(Metashape.Vector([x,y]))))
marker = chunk.addMarker(point)
marker_coord = chunk.crs.project(chunk.transform.matrix.mulp(marker.position))

1行目~4行目:Metashapeをimportして、モザイク化する前の画像を1枚指定。
5行目~6行目:画像座標系上の点[x,y]に、画像特有の変換行列(モザイク化で作成済み)をかけることで変換。
7行目~8行目:pointに対応するマーカーをchunkに設置し、この点を絶対座標系に変換。

おそらく、一番難しいのは座標系の変換です。
画像座標系→??座標系→絶対座標系
に変換しています。

いずれにしても、個別画像の特定のポイントに対応する3次元座標を取得することが出来ました。
「csvをインポートして、変換をforループで回した後、結果をcsvで出力」とかすれば、いい感じになりそうですね。(語彙力)

まとめ

Metashape Python APIを使うには、Agisoft forumで情報収集しつつPython API referenceを参照する必要があります。
もし参考になればいいね!お願いします~

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2