Pythonを使用してUAV画像のオルソフォト、デジタル標高モデル、3Dモデリングを生成する
OpenDroneMap
OpenDroneMap
は、オープンソースの空撮画像処理ツールで、点群、オルソフォト、標高モデルなどの空撮ができるのはもちろん、3次元再構成をして3次元モデルを生成することができます。単純に魔法のようなツールで、pix4dなどと同様の結果が得られます(私は今のところドローン画像のオルソフォト画像の生成しかやったことがありません)。
公式ドキュメントによると、PyODMはUAV画像のオルソ画像、DEM、3Dモデル、点群データを簡単に作成できるそうです。
オルソモザイクの効果は次のとおりです。
OpenDroneMapのPythonライブラリの使い始めはこちらです。
PyODM
.
注意:もし画像内にexif情報があれば、odmは直接tifオルソ画像を生成することができます。画像にexif情報を追加するには、以下のブログを参照してください。
https://blog.csdn.net/weixin_43162240/article/details/103579657
1. 環境整備
pyodmパッケージのインストール
pipでインストールするだけです。
pip install -U pyodm
ドッカーを起動する
pyodmはdockerの起動を必要とするので、使用する前にdockerもインストールする必要があります。
# install docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-get install -y docker-ce
# Start docker, here it will download the required packages by itself, so you need to wait for a while.
$ sudo docker run -ti -p 3000:3000 opendronemap/nodeodm
2. Pythonチュートリアル
大まかな流れとしては、まずNodeに接続し、新しいタスクを作成し、タスクの実行が終了するのを待って、最後に結果を取得する、という流れになります。
ここで重要なのは、新しいタスクを作成するときに、いくつかの設定を行うオプションがあることです。参照
ドキュメンテーション
をご覧いただくと、設定が処理速度や結果の品質に影響を与えることがおわかりいただけると思います。
オルソフォト制作の場合、設定が必要なパラメータがいくつかあります(パラメータは
公式ドキュメント
ビュー)は以下の通りです。
- 正射投影解像度:メートル/ピクセル、地上分解能を示す。
- dsm: dsmを生成するかどうか、生成しない場合はfalseを選択すると処理が速くなります。
- ignore-gsd: Trueに設定すると、アクセラレーションをスキップしてより良い画質を得ることができます。
- min-num-features: 探す特徴点の数、数が多いほど品質が良くなるが、処理時間が長くなる。
- texturing-nadir-weight: 公式に推奨されている値で、都市部では29-32、草地やフラットボトムでは0-6に設定されます。
- mesh-octree-depth: 公式に推奨されており、建物の屋根の滑らかさを増すために10-11に設定されています。
注意:オルソフォトを作成する場合、少なくとも2つのトラックのデータが入った画像を選ぶとよいでしょう。1つのルートからのデータスティッチングは失敗します。つまり、task.wait_for_completion()はFAILEDを返します。
import os
from pyodm import Node
import time
from tqdm import tqdm
image_dir = 'testdata/'
result_path = image_dir.split('/')[0]+'_results'
ip = 'xxx.xx.xx.xx' # change to your own ip
port = 3000
start = time.time()
images_name = os.listdir(image_dir)
images_name = [image_dir+image_name for image_name in images_name]
print(images_name)
n = Node(ip, port)
print("Node connected successfully, {} image started processing".format(len(images_name)))
task = n.create_task(images_name, {'orthophoto-resolution': 0.0274,"min-num-features":35000})
print("Task creation complete")
pbar = tqdm(total=100)
processing = 0
while True:
info = task.info()
if info.progress==100:
break
pbar.update(info.progress-processing)
processing = info.progress
if info.last_error!='':
print("error ", info.last_error)
time.sleep(0.1)
pbar.close()
print("processing complete")
# task.wait_for_completion()
task.download_assets(result_path)
print("{} images consumed {} seconds".format(len(images_name), time.time() - start))
3. その他
公式ドキュメントの閲覧には科学的なインターネットアクセスが必要な場合があるため、そのオプションを記載しています。
-h, --help show this help message and exit
--images <path>, -i <path>
Path to input images
--project-path <path>
Path to the project folder
--resize-to <integer>
resizes images by the largest side for opensfm. Set to
-1 to disable.
Default: 2048
--end-with <string>, -e <string>
Can be one of:dataset | split | merge | opensfm | mve
| odm_filterpoints | odm_meshing | mvs_texturing |
odm_georeferencing | odm_dem | odm_orthophoto
--rerun <string>, -r <string>
can be one of:dataset | split | merge | opensfm | mve
| odm_filterpoints | odm_meshing | mvs_te
--camera-lens <string>
Can be one of auto | perspective | brown | fisheye | spherical
Set a camera projection type. Manually setting a value
By default the application
By default the application tries to determine a lens type from the images metadata.
Default: auto
--max-concurrency <positive integer>
The maximum number of processes to use in various
Peak memory requirement is ~1GB per thread
and 2 megapixel image resolution.
Default: number of cores
--depthmap-resolution <positive float>
Controls the density of the point cloud by setting the
Higher values take
longer to compute and more memory but produce denser
point clouds.
Default: 640
--opensfm-depthmap-min-consistent-views <integer: 2 <= x <= 9>
Minimum number of views that should reconstruct a
Use lower values if your
Lower values result in
Lower values result in denser point clouds but with more noise.
if using OpenSfM for dense matching.
Default: 3
--opensfm-depthmap-method <string>
Raw depthmap computation algorithm.
PATCH_MATCH_SAMPLE are faster, but might miss some
BRUTE_FORCE takes longer but produces
denser reconstructions.
Default: PATCH_MATCH
--opensfm-depthmap-min-patch-sd <positive float>
When using PATCH_MATCH or PATCH_MATCH_SAMPLE, controls
the standard deviation threshold to include patches.
Patches with lower standard deviation are ignored.
Default: 1
--use-hybrid-bundle-adjustment
Run local bundle adjustment for every image added to
The reconstruction and a global adjustment every 100
Speeds up reconstruction for very large
datasets.
--mve-confidence <float: 0 <= x <= 1>
Discard points that have less than a certain
This only affects dense
This only affects dense reconstructions performed with MVE.
discard more points.
Default: 0.6
--Use a full 3D mesh to compute the orthophoto instead of a 2.5D mesh.
This option is a bit faster and
This option is a bit faster and provides similar results in planar areas.
--Skip generation of a full 3D model. This can save time
if you only need 2D results such as orthophotos and
DEMs.
--use-opensfm-dense Use opensfm to compute dense point cloud alternatively
--ignore-gsd Ignore Ground Sampling Distance (GSD). GSD caps the
GSD caps the maximum resolution of image outputs and resizes images
when ne
関連
-
[解決済み】Python HTTP Server/Client: リモートエンドが応答なしで接続を閉じたエラー
-
[解決済み] Python argparse: デフォルト値または指定された値
-
[解決済み] AttributeError: 'str' オブジェクトには 'get' 属性がありません。
-
[解決済み] Plotly Dash ドロップダウンメニュー python
-
[解決済み] 'module' オブジェクトには 'lru_cache' という属性がありません。
-
[解決済み] pyathenaを使ったaws athenaクエリの実行
-
[解決済み] Python Pandasで複数の列を適当に埋める
-
[解決済み] TypeError: 'unicode'オブジェクトは呼び出し可能ではありません。
-
[解決済み] numpyの未定義シンボルです。PyFPE_jbuf
-
PIPはランチャーでFatal errorが発生します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: 'bool'オブジェクトは呼び出し可能ではありません。
-
[解決済み】pip3を使用:モジュール "importlib._bootstrap" には "SourceFileLoader" という属性がない。
-
Python初心者のための関数の定義
-
[解決済み] numpy/scipy/ipython:Failed to interpret a file as a pickle
-
[解決済み] TypeError: 0-d配列に対する反復処理 Python
-
[解決済み] Pythonでコンソール出力を抑制する方法は?
-
[解決済み] pydotとgraphvizのエラーです。dot_parserをインポートできないため、ドットファイルの読み込みができません。
-
Pythonによる2次元辞書
-
python のエラーです。TypeError: 文字列のインデックスは整数でなければならない
-
AttributeError: モジュール 'numpy' には属性 'dtype' がない 問題