PIX4Dengine SDK v1 - 熱画像の処理方法
この記事では、PIX4Dengine を使用して熱画像を処理する方法を説明します。先に進む前に、 「熱画像の処理」を 。そこには、サポートされているカメラ、画像フォーマット、画像の取得方法など、熱マッピングに関する具体的な情報が記載されています。
処理オプション
熱画像は通常、RGB画像よりも解像度がはるかに低く、コントラストも低い場合が多い。そのため、こうした比較的特徴の少ない画像には、特別な処理オプションが必要となる場合がある。.
熱画像の処理設定を行う際の良い出発点となるのは、現在利用可能な2つの熱テンプレートです。
- THERMOMAP_CAMERA は senseFly の ThermoMAP カメラで撮影した画像用です。.
- THERMAL_CAMERA は、その他の一般的なサーマルカメラ (FLIR など) 用です。.
注: テンプレートの使用方法については、pix4dengine.create_project を参照してください。どちらのテンプレートでも、デフォルト設定は十分なディテールを備えた天底画像には通常十分です。いずれかの熱テンプレートを使用すると、熱オルソモザイク(実質的には「温度マップ」)が生成されます。
斜め画像を補正するには、マッチング戦略 「AutoOblique」を 使用する必要があります。
例:
from pix4dengine.options import AlgoOption
project.set_options((AlgoOption.CameraCalibration.MATCH_STRATEGY,"AutoOblique"))
斜め画像は、3Dモデルを再構築するためによく使用されます。ただし、点群とメッシュは温度分布に関する定性的な情報しか提供しないことに注意してください。相対温度または絶対温度に関する定量的な情報を得るには、熱反射率マップのみを使用できます。.
調整が難しいプロジェクトの修正
熱画像は、キャリブレーションが難しい場合があります。ここでは、そのような熱画像プロジェクトのキャリブレーションに役立つ処理オプションをいくつかご紹介します。.
- 熱画像は一般的に解像度が低い。画像スケールを高く設定することで、この問題を軽減できる。具体的には、キーポイントの画像スケールを 「カスタム」、画像スケールの値を2に設定する。
例:
project.set_options((AlgoOption.CameraCalibration.KEYPT_IMAGE_SCALE, “Custom”), (AlgoOption.CameraCalibration.IMAGE_SCALE, “2”))
- 有効 高精度な位置情報と方位の 画像の位置情報が正確な場合は、 代替 方法を使用する必要があります。
例:
pproject.set_options((AlgoOption.CameraCalibration.CALIBRATION_METHOD, “GeolocationAndOrientation”)
- 特徴点の少ない熱画像の場合、ターゲットキーポイントの数を固定すると、デフォルト設定よりも良い結果が得られることがあります。そのためには、キーポイント選択方法を 「カスタム」、キーポイントの最大数を指定する必要があります。通常、10000前後の値が最適です。
例:
project.set_options((AlgoOption.CameraCalibration.KEYPT_SEL_METHOD, “CustomNumberOfKeypoints”), (AlgoOption.CameraCalibration.KEYPT_NUMBER, 10_000))
- サーマルカメラのカメラモデル、焦点距離、ピクセルサイズは、画像メタデータに常に正しく記録されるとは限らず、EXIFに保存される情報も曖昧または不正確な場合があります。しかし、焦点距離とピクセルサイズの情報が信頼できる場合は、内部カメラパラメータを画像メタデータから抽出された値に近づけるように強制すると便利です。そのためには、内部カメラ最適化オプションを 「AllPrior」。
例:
project.set_options((AlgoOption.CameraCalibration.CALIBRATION_INT_PARAM_OPT, “AllPrior”)
熱マップの可視化
熱画像処理で生成される熱マップは、摂氏温度を表す単一バンドの浮動小数点値を含むTIFF画像です。浮動小数点TIF画像を読み込めるソフトウェアであれば、どれでもこれらのファイルを開くことができます。以下では、Engine SDKを使用して熱プロジェクトを作成および処理する方法、そして生成されたマップを自由に利用できるPythonライブラリを使用して読み込む方法を示す基本的な例を紹介します。.
例:
from pix4dengine import create_project
from pix4dengine.processing proxyimport Pipeline
from pix4dengine.constants.processing import ProcessingTemplate
from pix4dengine.exports import get_available_output
from pix4dengine.options import ExportOption
import rasterio
import matplotlib.pyplot as plt
import numpy as np
project = create_project("thermal",images_dir=IMG_DIR, template=ProcessingTemplate.THERMAL_CAMERA)
pipeline = Pipeline(project=project)
pipeline.run()
out_path, = get_available_output(project,
"all")[ExportOption.Index.REFLECTANCE]
thermal_tiff = rasterio.open(out_path)
map_data = np.ma.array(thermal_tiff.read(1), mask=thermal_tiff.read(2) == 0)
fig = plt.figure()
axes = fig.add_subplot(111)
axes.set_aspect("equal")
img = axes.imshow(map_data, extent=thermal_tiff.bounds, vmin=0, vmax=30)
colorbar = plt.colorbar(img)
colorbar.set_label("摂氏度")
axes.set_xlabel("東方向") axes.set_ylabel
("北方向")
axes.set_xlim(1.1e6, 2.2e6)
axes.set_ylim(2.3e6, 3.6e6)
plt.show()
from pix4dengine.processing proxyimport Pipeline
from pix4dengine.constants.processing import ProcessingTemplate
from pix4dengine.exports import get_available_output
from pix4dengine.options import ExportOption
import rasterio
import matplotlib.pyplot as plt
import numpy as np
project = create_project("thermal",images_dir=IMG_DIR, template=ProcessingTemplate.THERMAL_CAMERA)
pipeline = Pipeline(project=project)
pipeline.run()
out_path, = get_available_output(project,
"all")[ExportOption.Index.REFLECTANCE]
thermal_tiff = rasterio.open(out_path)
map_data = np.ma.array(thermal_tiff.read(1), mask=thermal_tiff.read(2) == 0)
fig = plt.figure()
axes = fig.add_subplot(111)
axes.set_aspect("equal")
img = axes.imshow(map_data, extent=thermal_tiff.bounds, vmin=0, vmax=30)
colorbar = plt.colorbar(img)
colorbar.set_label("摂氏度")
axes.set_xlabel("東方向") axes.set_ylabel
("北方向")
axes.set_xlim(1.1e6, 2.2e6)
axes.set_ylim(2.3e6, 3.6e6)
plt.show()
