Files
momentry_core/scripts/export_person_thumbnails.py
Warren 8f05a7c188 feat: update Python processors and add utility scripts
- Update ASR, face, OCR, pose processors
- Add release pre-flight check script
- Add synonym generation, chunk processing scripts
- Add face recognition, stamp search utilities
2026-04-30 15:07:49 +08:00

68 lines
1.9 KiB
Python

#!/opt/homebrew/bin/python3.11
"""
Export Person Thumbnails
職責:從聚類後的數據中提取每個 Person 的臉部截圖,用於確認身份。
"""
import cv2
import json
import os
import sys
# 設定
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()