welcom ! Handel home

2025年3月20日 星期四

MP4 影片進行 SLAM 範例

 只有 MP4 影片也是可以進行 SLAM 的!

不過你需要先做一點點前處理,因為大多數 SLAM 系統(像 ORB-SLAM3、RTAB-Map)需要的輸入是影格序列(image sequence)或是ROS 影像話題(image topic)


✅ 可行流程:用 MP4 執行 SLAM

🪜 Step-by-step 操作流程如下:


1️⃣ 影片轉影格(MP4 → 圖片序列)

使用 ffmpeg 或 Python 把 MP4 影片拆成影格:

➤ 使用 ffmpeg

bash
mkdir frames ffmpeg -i your_video.mp4 -qscale:v 2 frames/frame_%06d.png

這會把影片拆成連續圖片,例如:

bash
frames/frame_000001.png frames/frame_000002.png ...

➤ 使用 Python(可控制時間範圍)

python
import cv2 import os video = cv2.VideoCapture("your_video.mp4") os.makedirs("frames", exist_ok=True) i = 0 while video.isOpened(): ret, frame = video.read() if not ret: break cv2.imwrite(f"frames/frame_{i:06d}.png", frame) i += 1 video.release()

2️⃣ 建立 SLAM 配置與檔案清單

ORB-SLAM3 為例,它需要一個 rgb.txt

txt
# timestamp filename 0.000000 frames/frame_000000.png 0.033333 frames/frame_000001.png 0.066666 frames/frame_000002.png ...

你可以假設影片是 30 fps,frame 間隔為 0.033333 秒。


3️⃣ 準備相機參數(相機內參)

如果你知道影片是用哪個相機拍的,提供對應的 .yaml 設定檔會比較準確。

如果不知道,也可以用簡單的預設值開始實驗(例如 focal length 約為影像寬度的 1 倍)。

範例 TUM.yaml(供 ORB-SLAM3 使用)你可以從官方範例中修改即可。


4️⃣ 執行 SLAM 工具

使用 ORB-SLAM3:

bash
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt TUM.yaml rgb.txt

或是用 RTAB-Map 也支援 rtabmap-dataset 模式匯入圖片序列進行 SLAM。


🚀 可搭配強化的工具

工具作用說明
Cosmos tokenizer將影片壓縮成 token 加速處理搭配視覺模型訓練
Isaac Sim 錄影產生模擬影片資料集(可導出 MP4)模擬真實世界訓練場景
ffmpeg拆影格、調整解析度與格式非常好用的 CLI 工具

🎯 結論

🟢 是的,你可以只用 MP4 執行 SLAM。
不過你需要先:

  1. 把影片轉成影格(PNG/JPG)
  2. 給 SLAM 工具正確格式與相機參數

📌 SLAM 本身其實不關心資料從哪來,只要有一連串時間有序的影像,它就能建圖與定位。


如果你提供 MP4 路徑,我也可以幫你自動產生影格資料夾、rgb.txt,以及 ORB-SLAM3 的啟動腳本。

需要我幫你寫成 Python 腳本或 bash pipeline 嗎?還是你想先嘗試哪一個 SLAM 工具?

================================

mp4@SLAM 這裡是完整的 Python 腳本,幫你從一個 MP4 檔案:

  1. 擷取每一影格並儲存為圖片
  2. 根據影片的 FPS 自動產生對應的 rgb.txt(供 ORB-SLAM3 使用)

🐍 mp4_to_slam_dataset.py

python
import cv2 import os from pathlib import Path def extract_frames_from_video(video_path, output_dir, prefix="frame", image_ext=".png"): output_dir = Path(output_dir) output_dir.mkdir(parents=True, exist_ok=True) cap = cv2.VideoCapture(str(video_path)) if not cap.isOpened(): raise RuntimeError(f"無法開啟影片:{video_path}") fps = cap.get(cv2.CAP_PROP_FPS) print(f"影片 FPS: {fps}") timestamps = [] frame_count = 0 while True: ret, frame = cap.read() if not ret: break filename = f"{prefix}_{frame_count:06d}{image_ext}" filepath = output_dir / filename cv2.imwrite(str(filepath), frame) timestamps.append((frame_count / fps, filename)) frame_count += 1 cap.release() return timestamps def save_rgb_txt(timestamps, output_path): with open(output_path, "w") as f: f.write("# timestamp filename\n") for t, name in timestamps: f.write(f"{t:.6f} {name}\n") def main(): video_path = "your_video.mp4" # ← 替換為你的影片路徑 output_image_dir = "slam_frames" # ← 影格儲存資料夾 rgb_txt_path = "rgb.txt" # ← ORB-SLAM3 使用的輸入清單 timestamps = extract_frames_from_video(video_path, output_image_dir) save_rgb_txt(timestamps, rgb_txt_path) print(f"✅ 共擷取 {len(timestamps)} 張影格") print(f"📝 影格已儲存於:{output_image_dir}") print(f"📄 rgb.txt 產生於:{rgb_txt_path}") if __name__ == "__main__": main()

🧪 使用說明:

  1. 把你的 MP4 影片放在同個資料夾下或給絕對路徑
  2. 修改 main() 裡的 video_path 參數
  3. 執行:
bash
python mp4_to_slam_dataset.py

完成後會產生:

  • slam_frames/:影片拆出來的圖片
  • rgb.txt:ORB-SLAM3 可以讀取的影格清單

如果你接下來想結合 ORB-SLAM3、RTAB-Map,或是我幫你接成 Docker / ROS 環境,也可以再告訴我 🔧
要不要我下一步幫你做 ORB-SLAM3 的執行範例整合?

沒有留言: