# 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)