- Remove session-ses_2f27.md (161KB raw session log) - Remove 49 ROOT_* duplicate files across REFERENCE/ - Remove 14 duplicate files between REFERENCE/ root and history/ - Remove asr_legacy.rs (dead code, replaced by asr.rs) - Remove src/core/worker/ (duplicate JobWorker) - Remove src/core/layers/ (empty directory) - Remove 4 .bak files in src/ - Remove 7 dead private methods in worker/processor.rs - Remove backup directory from git tracking
67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
#!/opt/homebrew/bin/python3.11
|
|
"""
|
|
Export Person Thumbnails
|
|
職責:從聚類後的數據中提取每個 Person 的臉部截圖,用於確認身份。
|
|
"""
|
|
|
|
import cv2
|
|
import json
|
|
import os
|
|
|
|
# 設定
|
|
OUTPUT_DIR = "output/quick_preview"
|
|
VIDEO_PATH = os.path.join(OUTPUT_DIR, "preview.mp4")
|
|
JSON_PATH = os.path.join(OUTPUT_DIR, "preview.face_clustered.json")
|
|
|
|
|
|
def main():
|
|
if not os.path.exists(VIDEO_PATH):
|
|
print("❌ Video not found.")
|
|
return
|
|
if not os.path.exists(JSON_PATH):
|
|
print("❌ Clustered JSON not found.")
|
|
return
|
|
|
|
print(f"🔍 Extracting person thumbnails from {JSON_PATH}...")
|
|
|
|
with open(JSON_PATH) as f:
|
|
data = json.load(f)
|
|
|
|
cap = cv2.VideoCapture(VIDEO_PATH)
|
|
saved_persons = set()
|
|
|
|
for frame_obj in data.get("frames", []):
|
|
ts = frame_obj.get("timestamp")
|
|
faces = frame_obj.get("faces", [])
|
|
|
|
for face in faces:
|
|
pid = face.get("person_id")
|
|
|
|
# 如果這個 Person ID 還沒被存過
|
|
if pid and pid not in saved_persons:
|
|
# 定位到該時間點
|
|
cap.set(cv2.CAP_PROP_POS_MSEC, ts * 1000)
|
|
ret, frame = cap.read()
|
|
|
|
if ret:
|
|
x, y, w, h = face["x"], face["y"], face["width"], face["height"]
|
|
|
|
# 稍微擴大裁剪範圍以包含完整臉部特徵
|
|
margin = 5
|
|
crop = frame[
|
|
max(0, y - margin) : y + h + margin,
|
|
max(0, x - margin) : x + w + margin,
|
|
]
|
|
|
|
out_path = os.path.join(OUTPUT_DIR, f"{pid}.jpg")
|
|
cv2.imwrite(out_path, crop)
|
|
print(f"✅ Saved {pid} to {out_path}")
|
|
saved_persons.add(pid)
|
|
|
|
cap.release()
|
|
print(f"\n🎉 Finished! Saved {len(saved_persons)} unique person thumbnails.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|