トップ 構成 作業エビデンス 結果 問題解決の記録 SRTテレメトリ 移動量分析 分割戦略 サブセグメント分析

パイプライン構成

処理フロー

DJI .MP4
+ .SRT (GPS)
Step 1
COLMAP復元
Step 2
島除去
Step 3
テクスチャベイク
Step 4
プレビュー

Step 1: COLMAP復元(動画 → メッシュ)

概要

項目内容
入力DJI .MP4(+ 同梱 .SRT GPSデータ)
出力頂点カラー付きPLYメッシュ
使用ツールCOLMAP 3.9.1, ffmpeg, exiftool

内部フロー

  1. 動画解析: ffprobeで duration / FPS を取得、抽出フレーム数を計算
  2. フレーム抽出: ffmpegでJPEG出力(スケールダウン: 最大1500px)
  3. GPSデータ抽出: SRTファイルからフレームごとの緯度・経度・高度・焦点距離を取得
  4. セグメント分割: 長尺動画を ~35フレーム/seg に自動分割(OOM回避)
  5. セグメントループ: 各セグメントで以下を逐次実行:
    1. フレームコピー(ハードリンクで省ディスク)
    2. exiftoolでGPSタグ埋め込み
    3. feature_extractor: 特徴点抽出(CPU SIFT, SIMPLE_RADIALカメラモデル)
    4. sequential_matcher: 連続フレーム間マッチング(overlap=20)
    5. mapper: インクリメンタルSfM(カメラ位置 + 3D点群推定)
    6. 最良sparseモデル選択(points3Dサイズ最大)
    7. model_aligner: GPS座標でENU位置合わせ(失敗時はraw model利用)
    8. image_undistorter: カメラ歪み補正
    9. patch_match_stereo: 密対応点探索(GPU/CUDA, VRAM超過時はCPU)
    10. stereo_fusion: 点群統合(input_type=photometric)
    11. poisson_mesher: Poisson再構成でメッシュ化
  6. 全セグメント中最良メッシュ(ファイルサイズ最大)を最終出力に選択

品質パラメータ

品質max_num_features推奨用途
low(デフォルト)2,0484GB GPU / 長尺動画
medium4,0966GB+ GPU / 短尺動画
high8,1928GB+ GPU

セグメント分割の仕組み

長尺動画を MAX_FRAMES_PER_SEG = 35 フレームを基準に自動分割。セグメント間にオーバーラップ(デフォルト10フレーム)を持たせ、繋ぎ目の連続性を確保。

例: 142フレーム(71秒 @ 2fps)→ 5セグメント(各28-38フレーム)


Step 2: メッシュ島除去

項目内容
スクリプトclean_islands.py
入力PLY(頂点カラー付き)
出力最大連結成分のみのPLY
使用ツールOpen3D

COLMAPのPoisson再構成は浮遊メッシュ片(島)を多数生成する。Open3Dのconnected-component分析で最大連結成分のみを抽出。

例: 0154_Dでは1224島→最大1島(7.6M tris)にまで削減。島除去を先に行うことでベイク時間が大幅短縮・品質向上。


Step 3: テクスチャベイク

項目内容
スクリプトplanar_bake.py
入力PLY(頂点カラー付き)
出力OBJ + MTL + PNG
使用ツールBlender 4.4(--background, Cycles CPU)

手法


Step 4: プレビューレンダリング

項目内容
スクリプトrender_preview.py
入力OBJ(テクスチャ付き)または PLY(頂点カラー)
出力1920×1080 PNG
使用ツールBlender 4.4(--background, Cycles)

カメラ設定

パラメータ説明
注視点(cx, cy, z_min + h×0.3)下端から30%高さ(地上モデル最適化)
水平距離size×2.0モデルのbounding box最大径の2倍
カメラ高さh/2 + size高さ方向中央+サイズ分
俯角26.8°斜め上からの見下ろし
レンダラーCycles32 samples

補助スクリプト

スクリプト用途
recover_segments.py特定セグメントのみ再処理(COLMAP障害復旧)
merge_and_bake.py複数セグメントマージ→島除去→ベイク→プレビューを一括
clean_ply.pyPLYヘッダの余分なproperty行を除去
ply2obj.pyPLY→OBJ変換(Blender不要)
merge_sessions.py複数セッションをICP位置合わせ→マージ
turntable_render.pyターンテーブル動画(MP4, 180fr @ 30fps)

ツール環境

ツールバージョン備考
COLMAP3.9.1GPU SIFT非互換(CUDA 13.2)のためCPU SIFT強制
Blender4.4常に --background モード使用
Open3D(Python venv)島除去・点群処理
ffmpeg8.1JPEG marker非互換あり(OpenCV再保存で対応)
GPU4GB VRAM制約あり、全工程でメモリ管理が重要

用語集

用語説明
COLMAPSfM(Structure from Motion)・MVS(Multi-View Stereo)による3D復元パイプライン
SfMStructure from Motion。異なる視点の画像群から3D構造とカメラ位置を同時に推定
MVSMulti-View Stereo。SfMで推定したカメラ位置から密な点群を生成
PLYPolygon File Format。頂点座標+色・法線情報を格納する3Dメッシュ形式
OBJ+MTL+PNGテクスチャ付き3Dモデルの標準形式(形状・素材定義・テクスチャ画像)
頂点カラーメッシュ各頂点に直接RGB色が割り当てられた状態
テクスチャベイク頂点カラーをUVマップ経由で画像に焼き付ける処理
メッシュ島Poisson再構成で発生する、メイン物体と未接続の浮遊メッシュ片
SRTDJIドローンの字幕ファイル形式。GPS座標・高度・速度情報を含む
セグメントCOLMAPパイプラインが長尺動画を自動分割した単位(~35フレーム)
閉包面Poisson再構成で点群裏側にできる布状アーチファクト。点群マージ+単一Poissonで解決
CyclesBlender内蔵の物理ベースレンダラー(パストレーシング方式)