1. ホーム
  2. パイソン

Pythonを使用してUAV画像のオルソフォト、デジタル標高モデル、3Dモデリングを生成する

2022-02-24 20:40:47
<パス

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