Bonjour,
Merci pour ces retours. Pour l'instant je regarde plus particulièrement un code Python avec OpenCV, en partant d'une vidéo en fichier. La vidéo bouge un peu donc j'ai des objets parasites.
Voici le code que j'utilise pour l'instant,
import cv2
import numpy as np
# Paramètres
video_source = 'votre_video_stab.mp4' # Chemin de la vidéo d'entrée
output_video_name = 'video_objets_mouvement.mp4' # Nom du fichier vidéo de sortie
resize_scale = 0.25 # Échelle de réduction de l'image
min_contour_area = 1000 # Seuil minimum pour la taille de l'aire du contour
circle_radius = 20 # Rayon du cercle à dessiner autour des objets en mouvement
# Paramètres pour le flux optique Farneback
pyr_scale = 0.4
levels = 3
winsize = 15
iterations = 3
poly_n = 5
poly_sigma = 1.2
flags = 0
# Initialiser la capture vidéo
cap = cv2.VideoCapture(video_source)
# Vérifier si la vidéo a pu être ouverte
if not cap.isOpened():
print("Erreur: Impossible d'ouvrir la vidéo.")
exit()
# Obtenir les propriétés de la vidéo d'entrée
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH) * resize_scale)
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT) * resize_scale)
fps = cap.get(cv2.CAP_PROP_FPS)
# Définir le codec et créer l'objet VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_video_name, fourcc, fps, (frame_width, frame_height))
# Lecture de la première trame
ret, prev_frame = cap.read()
if not ret:
print("Erreur lors de la lecture de la vidéo")
cap.release()
out.release()
exit()
prev_frame = cv2.resize(prev_frame, (frame_width, frame_height))
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# Redimensionner l'image
frame = cv2.resize(frame, (frame_width, frame_height))
# Convertir l'image en niveaux de gris
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Calculer le flux optique dense entre les deux trames
flow = cv2.calcOpticalFlowFarneback(prev_gray, gray, None, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags)
# Calculer le module et l'angle du flux optique
magnitude, _ = cv2.cartToPolar(flow[..., 0], flow[..., 1])
# Appliquer un seuillage pour détecter les mouvements
_, motion_mask = cv2.threshold(magnitude, 5, 255, cv2.THRESH_BINARY)
# Recherche des contours dans le masque de mouvement
contours, _ = cv2.findContours(motion_mask.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Dessiner les cercles autour des contours détectés
for contour in contours:
contour_area = cv2.contourArea(contour)
if contour_area > min_contour_area:
M = cv2.moments(contour)
if M["m00"] != 0:
center_x = int(M["m10"] / M["m00"])
center_y = int(M["m01"] / M["m00"])
cv2.circle(frame, (center_x, center_y), circle_radius, (0, 255, 0), 2)
# Écrire la trame dans le fichier vidéo de sortie
out.write(frame)
# Afficher l'image avec les cercles autour des contours détectés
cv2.imshow('Cercles', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Mettre à jour la trame précédente et l'image en niveaux de gris
prev_frame = frame.copy()
prev_gray = gray.copy()
# Libérer les ressources
cap.release()
out.release()
cv2.destroyAllWindows()