起步門檻改為『達到(滿)8秒』即算成功保留(>= 改成 <)

原本行駛要『超過』8秒才算起步成功;改成行駛『達到/滿』8秒(>=)就算成功並保留,
含這 8 秒。合併條件由 <= 改為 <(行駛 <8秒 才併入剪掉)。

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

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-03 21:39:54 +08:00
parent b8d82bdef5
commit e2647eca05
2 changed files with 9 additions and 9 deletions
+1 -1
View File
@@ -87,7 +87,7 @@ python auto_remove_redlight.py 01.MOV 03.MOV 05.MOV
| `speed_threshold` | `0` | 時速 ≤ 此值視為停止 | | `speed_threshold` | `0` | 時速 ≤ 此值視為停止 |
| `min_confidence` | `0.5` | OCR 信心低於此值視為雜訊 | | `min_confidence` | `0.5` | OCR 信心低於此值視為雜訊 |
| `smooth_window` | `5` | 中位數濾波視窗(取樣點數) | | `smooth_window` | `5` | 中位數濾波視窗(取樣點數) |
| `depart_seconds` | `8.0` | 起步門檻(秒):兩段停車間「持續行駛」需超過此秒數才算真正起步而保留;否則(起步 N 秒內又停)視為仍在等待,連同短暫蠕動一起剪掉(處理車陣走走停停) | | `depart_seconds` | `8.0` | 起步門檻(秒):兩段停車間「持續行駛」需達到(滿)此秒數才算起步成功並保留(含這 8 秒);不足者(起步 N 秒內又停)視為仍在等待,連同短暫蠕動一起剪掉(處理車陣走走停停) |
| `cut_before_stop` | `2.0` | 進入紅燈端(速度到 0)移除起點再往前幾秒,連減速進站一起砍 | | `cut_before_stop` | `2.0` | 進入紅燈端(速度到 0)移除起點再往前幾秒,連減速進站一起砍 |
| `keep_after_stop` | `2.0` | 綠燈起步端(速度從 0 開始跑)移除終點提早幾秒,多留卡達起步畫面 | | `keep_after_stop` | `2.0` | 綠燈起步端(速度從 0 開始跑)移除終點提早幾秒,多留卡達起步畫面 |
| `min_keep` | `0.8` | 保留片段短於此秒數即丟棄 | | `min_keep` | `0.8` | 保留片段短於此秒數即丟棄 |
+8 -8
View File
@@ -103,9 +103,9 @@ MAX_SPEED = 300 # 合理時速上限,超過視為誤判(雜
SMOOTH_WINDOW = 7 # 中位數濾波視窗(取樣點數,奇數)。7 = 看前後各 3 秒。 SMOOTH_WINDOW = 7 # 中位數濾波視窗(取樣點數,奇數)。7 = 看前後各 3 秒。
# 要夠大才能蓋過「行駛中連續讀不到」的空白(被當0), # 要夠大才能蓋過「行駛中連續讀不到」的空白(被當0),
# 避免把高速行駛誤判成停車(視窗 7 可容忍最多 3 連續空白)。 # 避免把高速行駛誤判成停車(視窗 7 可容忍最多 3 連續空白)。
DEPART_SECONDS = 8.0 # 起步門檻(秒): 兩段停車中間「持續行駛」需超過此秒數, DEPART_SECONDS = 8.0 # 起步門檻(秒): 兩段停車中間「持續行駛」需『達到(滿)』此秒數,
# 才算真正起步而保留;否則(起步 N 秒內又停)視為仍在等待, # 才算真正起步成功並保留(含這 8 秒);不足者(起步 N 秒內又停)
# 連同那段短暫蠕動一起剪掉(處理車陣走走停停)。 # 視為仍在等待,連同那段短暫蠕動一起剪掉(處理車陣走走停停)。
# --- 剪輯 / 輸出參數 ---------------------------------------- # --- 剪輯 / 輸出參數 ----------------------------------------
# 紅燈移除段的頭尾「不對稱」微調: # 紅燈移除段的頭尾「不對稱」微調:
@@ -357,13 +357,13 @@ def find_keep_intervals(samples: List[Sample], duration: float, interval: float
else: else:
i += 1 i += 1
# 2) 合併「中間行駛不超過 DEPART_SECONDS 秒」的相鄰停止段: # 2) 合併「中間行駛不 DEPART_SECONDS 秒」的相鄰停止段:
# 起步後 N 秒內又停 → 視為仍在等待(車陣走走停停),連那段短暫蠕動一起算停止。 # 起步後不到門檻又停 → 視為仍在等待(車陣走走停停),連那段短暫蠕動一起算停止。
# 只有行駛「超過」DEPART_SECONDS 才算真正起步,該行駛段才會被保留。 # 行駛「達到(滿)」DEPART_SECONDS 即算起步成功,該行駛段(含這 8 秒)會被保留。
merged_runs: List[List[float]] = [] merged_runs: List[List[float]] = []
for run in raw_runs: for run in raw_runs:
if merged_runs and (run[0] - merged_runs[-1][1]) <= DEPART_SECONDS: if merged_runs and (run[0] - merged_runs[-1][1]) < DEPART_SECONDS:
merged_runs[-1][1] = run[1] # 行駛 <= 門檻 → 併入前一段停止 merged_runs[-1][1] = run[1] # 行駛 < 門檻 → 併入前一段停止
else: else:
merged_runs.append(list(run)) merged_runs.append(list(run))