Download opencv_sample.py from Intel/scene-change-detection: direct link, hf CLI and curl.
- Browser
- Download file 1.7 kB
-
https://huggingface.co/Intel/scene-change-detection/resolve/main/opencv_sample.py
- Command line
-
hf download hf://Intel/scene-change-detection/opencv_sample.py
-
curl -L -o opencv_sample.py https://huggingface.co/Intel/scene-change-detection/resolve/main/opencv_sample.py
1.7 kB
| # SPDX-License-Identifier: MIT | |
| # Copyright (C) Intel Corporation | |
| # | |
| # Scene Change Detection: OpenCV sample. | |
| # See README.md for prerequisites and inputs. Run: python3 opencv_sample.py | |
| import cv2 | |
| import numpy as np | |
| INPUT_VIDEO = "test_video.mp4" | |
| CHANGE_THRESHOLD = 0.45 # Bhattacharyya distance in [0, 1]; higher = more change | |
| cap = cv2.VideoCapture(INPUT_VIDEO) | |
| fps = cap.get(cv2.CAP_PROP_FPS) or 30.0 | |
| width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) | |
| height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) | |
| writer = cv2.VideoWriter( | |
| "output_opencv.mp4", cv2.VideoWriter_fourcc(*"mp4v"), fps, (width, height)) | |
| def frame_histogram(bgr): | |
| hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV) | |
| hist = cv2.calcHist([hsv], [0, 1], None, [50, 60], [0, 180, 0, 256]) | |
| cv2.normalize(hist, hist, 0, 1, cv2.NORM_MINMAX) | |
| return hist | |
| prev_hist = None | |
| frame_idx = 0 | |
| scene_changes = 0 | |
| while True: | |
| ok, frame = cap.read() | |
| if not ok: | |
| break | |
| frame_idx += 1 | |
| hist = frame_histogram(frame) | |
| distance = 0.0 | |
| changed = False | |
| if prev_hist is not None: | |
| distance = cv2.compareHist(prev_hist, hist, cv2.HISTCMP_BHATTACHARYYA) | |
| changed = distance >= CHANGE_THRESHOLD | |
| prev_hist = hist | |
| if changed: | |
| scene_changes += 1 | |
| print(f"Frame {frame_idx}: SCENE CHANGE (distance={distance:.3f})", | |
| flush=True) | |
| color = (0, 0, 255) if changed else (0, 255, 0) | |
| label = f"dist={distance:.3f}" + (" CHANGE" if changed else "") | |
| cv2.putText(frame, label, (10, 30), | |
| cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2) | |
| writer.write(frame) | |
| cap.release() | |
| writer.release() | |
| print(f"Scene changes detected: {scene_changes}", flush=True) | |