scene-change-detection / opencv_sample.py
vagheshpatel's picture
Update native RC1 samples and supported device documentation
9c03712 verified
Raw History Blame Contribute Delete
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)