Files
Redlight_Remover/README.md
T
JianMiau 8f5c01b56c 紅燈移除段改為不對稱偏移(前砍後留)
- 新增 cut_before_stop: 進入紅燈端(速度到 0)移除起點再往前砍,連減速進站一起去掉
- 新增 keep_after_stop: 綠燈起步端(速度從 0 開始跑)移除終點提早結束,多留卡達起步畫面
- 取代原本對稱的 stop_padding;兩者預設皆 2 秒,可於 config.json 調整
- 同步更新 README 參數說明

本次調整由 Claude Opus 4.8 (1M context) 協助處理。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 18:46:33 +08:00

148 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Redlight Remover — 機車第一人稱影片自動去紅燈工具
針對「安全帽第一人稱機車影片」,自動偵測等紅燈的停車片段並剪掉,輸出無損的去紅燈影片。
程式用 OCR 讀取畫面上的 GPS 時速表,當時速持續為 0 超過設定秒數即判定為紅燈,再用 FFmpeg 無損切割拼接。
---
## 功能特色
- 🎯 **自動偵測紅燈**:逐秒 OCR 辨識時速,連續停車超過門檻即視為等紅燈
- ✂️ **無損剪輯**:用 FFmpeg `-c copy` 串流複製,畫質零損失、速度快
- 🧹 **抗雜訊平滑**:中位數濾波 + 補空值 + 相鄰段合併,解決停車時 OCR 在 0 與雜訊間跳動的問題
-**GPU 加速**:支援 NVIDIA CUDAOCR 大幅加速
- 🖱️ **互動選單**:批次檔啟動,↑↓ 選資料夾、空白鍵勾選影片
- ⚙️ **設定檔**:所有參數集中在 `config.json`,免改程式碼
- 📊 **辨識紀錄**:每支影片輸出 `*_speeds.csv`,方便檢查 OCR 結果
---
## 環境需求
- **Python 3.x**
- **FFmpeg / ffprobe**(需加入系統 PATH
- Python 套件:`easyocr``opencv-python``numpy`
- (選用)NVIDIA 顯卡 + CUDA 版 PyTorch 以啟用 GPU
### 安裝
```bat
pip install -r requirements.txt
```
FFmpeg 可用 winget 安裝:
```bat
winget install Gyan.FFmpeg
```
啟用 GPU(需 NVIDIA 顯卡),安裝對應 CUDA 版 PyTorch,例如:
```bat
pip install --force-reinstall torch torchvision --index-url https://download.pytorch.org/whl/cu128
```
---
## 使用方法
### 方式一:互動批次檔(推薦)
雙擊 `啟動.bat`,依選單操作:
1.`[1]` 預覽 ROI:先確認時速表框選位置(第一次使用建議先做)
2.`[2]` 開始處理:
- ↑↓ 移動、Enter 選擇要處理的資料夾
- ↑↓ 移動、**空白鍵勾選**要去紅燈的影片、Enter 開始
- 處理完成,成品輸出到該資料夾的 `no_redlight\` 子資料夾
### 方式二:命令列
```bat
:: 預覽 ROI(確認時速表位置)
python auto_remove_redlight.py 20260516 --preview
:: 處理整個資料夾
python auto_remove_redlight.py 20260516
:: 處理單一影片
python auto_remove_redlight.py E:\videos\20260516\01.MOV
:: 處理多支指定影片
python auto_remove_redlight.py 01.MOV 03.MOV 05.MOV
```
---
## 設定檔 `config.json`
所有常用參數集中於此,每次執行會自動讀取(檔案不存在時會自動產生預設值)。
| 參數 | 預設值 | 說明 |
|------|--------|------|
| `roi` | `[3300, 1770, 300, 140]` | 時速表在畫面上的位置 `[x, y, 寬, 高]` |
| `sample_interval` | `1.0` | 取樣間隔(秒),每幾秒辨識一次;越小越精準但越慢 |
| `progress_every` | `60` | 進度回報間隔(秒),純顯示用,不影響效能 |
| `stop_seconds` | `4.0` | 連續停車超過幾秒判定為紅燈 |
| `speed_threshold` | `0` | 時速 ≤ 此值視為停止 |
| `min_confidence` | `0.5` | OCR 信心低於此值視為雜訊 |
| `smooth_window` | `5` | 中位數濾波視窗(取樣點數) |
| `merge_gap` | `3.0` | 相鄰紅燈段間隔小於此秒數即合併 |
| `cut_before_stop` | `2.0` | 進入紅燈端(速度到 0)移除起點再往前幾秒,連減速進站一起砍 |
| `keep_after_stop` | `2.0` | 綠燈起步端(速度從 0 開始跑)移除終點提早幾秒,多留卡達起步畫面 |
| `min_keep` | `0.8` | 保留片段短於此秒數即丟棄 |
| `use_gpu` | `true` | 是否使用 GPU(無 CUDA 時自動退回 CPU |
| `reencode` | `false` | `false` = 無損快剪;`true` = 重新編碼,切點精準到幀但較慢 |
| `base_dir` | `E:\\videos` | 影片根目錄 |
> 參數優先順序:**命令列參數 > config.json > 程式內建預設**
---
## 輸出結果
成品放在來源資料夾的 `no_redlight\` 子資料夾,原始影片不會被改動:
```
<影片資料夾>\no_redlight\
├─ 01_no_redlight.MOV ← 去紅燈後的成品
├─ 01_speeds.csv ← 每秒辨識時速紀錄(檢查用)
└─ ...
```
---
## 運作原理
1. 用 OpenCV 每隔 N 秒抽一幀
2. 裁切出畫面上時速表的固定像素區域(ROI)
3. 用 EasyOCR 只辨識數字,讀出當下時速
4. 對逐秒時速做平滑濾波(補空值 + 中位數),壓掉跳動雜訊
5. 時速持續為 0 超過門檻 → 判定為等紅燈,標記移除
6. 用 FFmpeg 無損切割保留片段並拼接,輸出去紅燈影片
---
## 注意事項
- 不同影片的儀表疊加位置可能不同,換來源時請先用 `--preview` 確認並調整 `roi`
- 無損模式切點會對齊最近的關鍵幀,實際剪接點可能 ±1~2 秒(對去紅燈用途通常足夠)
- 程式只處理資料夾第一層的影片,不會遞迴子資料夾
---
## 檔案說明
| 檔案 | 用途 |
|------|------|
| `auto_remove_redlight.py` | 主程式 |
| `啟動.bat` | 互動式啟動器(Big5 編碼) |
| `_bat_src.txt` | 啟動器的 UTF-8 原始碼 |
| `_convert.ps1` | 把 `_bat_src.txt` 轉成 Big5 的 `啟動.bat` |
| `config.json` | 參數設定檔 |
| `requirements.txt` | Python 套件清單 |
---
> 本工具由 **Claude Opus 4.8 (1M context)** 協助開發與處理。