Open1

【メモ】Insta360で3D Gaussian Splattingを作成

peraperaperapera

Insta360 INSV から PostShot へのワークフロー

1. .insvファイルから mp4 への変換

変換方法の選択

  • Insta360 公式アプリケーションを使用
  • ffmpeg を使用(以下のコマンド例)

ffmpeg による変換コマンド

基本変換コマンド

単一ファイル変換(4K以下の録画用)- 8K出力
ffmpeg -i input.insv -vf "v360=dfisheye:equirect:ih_fov=190:iv_fov=190:w=7680:h=3840:interp=lanczos" \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p output_8k.mp4
5.7K録画用(デュアルファイル結合)- 8K出力

*00**10*ファイルを結合して8K出力

ffmpeg -i video_00.insv -i video_10.insv -filter_complex \
"[0:v][1:v]hstack=inputs=2[dual]; \
[dual]v360=dfisheye:equirect:ih_fov=190:iv_fov=190:w=7680:h=3840:interp=lanczos[out]" \
-map "[out]" -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p output_8k.mp4

解像度別変換コマンド

4K (3840×1920)
ffmpeg -i input.insv -vf "v360=dfisheye:equirect:ih_fov=190:iv_fov=190:w=3840:h=1920:interp=lanczos" \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p output_4k.mp4
2K (2048×1024)
ffmpeg -i input.insv -vf "v360=dfisheye:equirect:ih_fov=190:iv_fov=190:w=2048:h=1024:interp=lanczos" \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p output_2k.mp4
Full HD (1920×1080) - 16:9用にクロップ
ffmpeg -i input.insv -vf "v360=dfisheye:equirect:ih_fov=190:iv_fov=190:w=1920:h=1080:interp=cubic" \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p output_fhd.mp4

品質別設定(8K出力)

最高品質(処理時間長)
ffmpeg -i input.insv -vf "v360=dfisheye:equirect:ih_fov=190:iv_fov=190:w=7680:h=3840:interp=lanczos" \
-c:v libx264 -preset veryslow -crf 15 -b:v 100M -pix_fmt yuv420p \
-movflags +faststart output_8k_best.mp4
バランス品質(推奨)
ffmpeg -i input.insv -vf "v360=dfisheye:equirect:ih_fov=190:iv_fov=190:w=7680:h=3840:interp=lanczos" \
-c:v libx264 -preset slow -crf 18 -b:v 50M -pix_fmt yuv420p output_8k_balanced.mp4
高速処理(品質低下)
ffmpeg -i input.insv -vf "v360=dfisheye:equirect:ih_fov=190:iv_fov=190:w=7680:h=3840:interp=linear" \
-c:v libx264 -preset fast -crf 23 -pix_fmt yuv420p output_8k_fast.mp4

2. mp4(エクイレクタングラー形式)からフレーム画像の生成

ffmpeg による全方位フレーム抽出

推奨設定(高重複率)

INPUT_VIDEO="input_equirect.mp4"
MAX_JOBS=4
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
OUTPUT_DIR="frames_recommended_high_overlap_${TIMESTAMP}"
mkdir -p "$OUTPUT_DIR"
echo "✅ Output directory: $OUTPUT_DIR"

job_count=0
for pitch in -45 0 45 90 -90; do
  for yaw in $(seq 0 20 340); do
    while [ $job_count -ge $MAX_JOBS ]; do
      wait -n 2>/dev/null || { job_count=0; break; }
      job_count=$((job_count-1))
    done
    
    ffmpeg -hide_banner -loglevel error -stats -i "$INPUT_VIDEO" \
      -vf "v360=e:rectilinear:yaw=$yaw:pitch=$pitch:h_fov=90:v_fov=90:w=3072:h=3072:interp=lanczos,fps=1" \
      -q:v 1 -pix_fmt yuv420p "${OUTPUT_DIR}/pitch$(printf "%+03d" $pitch)_yaw$(printf "%03d" $yaw)_%04d.jpg" &
    
    job_count=$((job_count+1))
    echo "  [${job_count}/${MAX_JOBS}] Processing: pitch=$pitch, yaw=$yaw"
  done
done
wait
echo "✅ All processes completed."

軽量版(水平一周のみ)

INPUT_VIDEO="input_equirect.mp4"
MAX_JOBS=8
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
OUTPUT_DIR="frames_lightweight_test_${TIMESTAMP}"
mkdir -p "$OUTPUT_DIR"
echo "✅ Output directory: $OUTPUT_DIR"

job_count=0
for pitch in 0; do
  for yaw in $(seq 0 30 330); do
    while [ $job_count -ge $MAX_JOBS ]; do
      wait -n 2>/dev/null || { job_count=0; break; }
      job_count=$((job_count-1))
    done
    
    ffmpeg -hide_banner -loglevel error -stats -i "$INPUT_VIDEO" \
      -vf "v360=e:rectilinear:yaw=$yaw:pitch=$pitch:h_fov=90:v_fov=90:w=1536:h=1536:interp=lanczos,fps=1" \
      -q:v 2 -pix_fmt yuv420p "${OUTPUT_DIR}/pitch$(printf "%+03d" $pitch)_yaw$(printf "%03d" $yaw)_%04d.jpg" &
    
    job_count=$((job_count+1))
    echo "  [${job_count}/${MAX_JOBS}] Processing: pitch=$pitch, yaw=$yaw"
  done
done
wait
echo "✅ All processes completed."

軽量版高画質(水平一周のみ・高解像度)

INPUT_VIDEO="input_equirect.mp4"
MAX_JOBS=12
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
OUTPUT_DIR="frames_lightweight_test_${TIMESTAMP}"
mkdir -p "$OUTPUT_DIR"
echo "✅ Output directory: $OUTPUT_DIR"

job_count=0
for pitch in 0; do
  for yaw in $(seq 0 30 330); do
    while [ $job_count -ge $MAX_JOBS ]; do
      wait -n 2>/dev/null || { job_count=0; break; }
      job_count=$((job_count-1))
    done
    
    ffmpeg -hide_banner -loglevel error -stats -i "$INPUT_VIDEO" \
      -vf "v360=e:rectilinear:yaw=$yaw:pitch=$pitch:h_fov=90:v_fov=90:w=3072:h=3072,fps=1" \
      -q:v 2 -pix_fmt yuv420p "${OUTPUT_DIR}/pitch$(printf "%+03d" $pitch)_yaw$(printf "%03d" $yaw)_%04d.jpg" &
    
    job_count=$((job_count+1))
    echo "  [${job_count}/${MAX_JOBS}] Processing: pitch=$pitch, yaw=$yaw"
  done
done
wait
echo "✅ All processes completed."

3. RealityCapture 2.0 での処理

  1. 画像の読み込み

    • 生成したフレーム画像を読み込む
  2. Alignment の作成

    • カメラポジションの推定と調整
  3. Point Cloud のエクスポート

    • 点群データの出力
  4. 設定ファイルのエクスポート

    • プロジェクト設定の保存
  5. ファイルの配置

    • PLYファイル
    • CSVファイル
    • 画像ファイル
    • 上記を同じディレクトリに配置

4. PostShot での読み込み

  • 準備したファイルをドラッグアンドドロップで読み込む

補足情報

  • エクイレクタングラー(Equirectangular): 正距円筒図法による360度パノラマ形式
  • パラメータ調整: 用途に応じて解像度、品質、処理速度のバランスを調整
  • 並列処理: MAX_JOBS パラメータで同時実行数を制御(CPUコア数に応じて調整)