import cv2 import numpy as np # 1. Deschidere cameră cap = cv2.VideoCapture(0) if not cap.isOpened(): print("Eroare: nu pot deschide camera.") exit(1) # 2. Creăm modelul de background fgbg = cv2.createBackgroundSubtractorMOG2( history=500, varThreshold=16, detectShadows=True ) # Kernel pentru operații morfologice (curățare mască) kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) while True: # 3. Citire frame ret, frame = cap.read() if not ret: print("Eroare: nu pot citi frame de la cameră.") break # 4. Aplicăm background subtraction -> mască de mișcare fgmask = fgbg.apply(frame) # 5. Curățăm masca (eliminăm zgomotul) # - întâi un blur mic (opțional) fgmask_blur = cv2.GaussianBlur(fgmask, (5, 5), 0) # - apoi prag (ca să avem 0/255) _, fgmask_bin = cv2.threshold(fgmask_blur, 200, 255, cv2.THRESH_BINARY) # - morfologie (OPEN + CLOSE) fgmask_open = cv2.morphologyEx(fgmask_bin, cv2.MORPH_OPEN, kernel) fgmask_clean = cv2.morphologyEx(fgmask_open, cv2.MORPH_CLOSE, kernel) # 6. Căutăm contururi în mască (zonele cu mișcare) contours, _ = cv2.findContours( fgmask_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) # 7. Pentru fiecare zonă cu mișcare, desenăm un dreptunghi for cnt in contours: area = cv2.contourArea(cnt) if area < 500: # ignorăm obiecte foarte mici / zgomot continue x, y, w, h = cv2.boundingRect(cnt) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # 8. Afișăm rezultatul cv2.imshow("Frame original", frame) cv2.imshow("Masca miscare (curatata)", fgmask_clean) # 9. Ieșire cu tasta 'q' if cv2.waitKey(30) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()