Extracting Frames From A Video In Matlab

6 次查看(过去 30 天)
he generado el siguiente código, mi idea es poder sacar una secuencia de 4 o 5 fotogramas de un movimiento o momento del sujeto del video:
clear all;
close all;
clc;
% Cargar el video
videoReader = VideoReader('MujerCorriendo.mp4');
% Obtener el primer fotograma como fondo
fondo = readFrame(videoReader);
% Inicializar la imagen final como la imagen de fondo
imagen_final = fondo;
% Definir los tiempos en segundos para capturar los fotogramas
tiempos = [2, 3.5, 6, 9.2, 12.5];
% Obtener la duración total del video
videoDuration = videoReader.Duration;
% Bucle para procesar cada fotograma en los tiempos especificados
for t = tiempos
% Asegurarse de que el tiempo esté dentro del rango del video
if t > videoDuration
warning('El tiempo %f está fuera del rango del video.', t);
continue;
end
% Leer el fotograma correspondiente al tiempo t
videoReader.CurrentTime = t;
if hasFrame(videoReader)
frame = readFrame(videoReader);
else
warning('No se pudo leer el fotograma en el tiempo %f.', t);
continue;
end
% Convertir las imágenes a escala de grises para la segmentación
fondo_gray = rgb2gray(fondo);
frame_gray = rgb2gray(frame);
% Restar el fondo para obtener la diferencia
diff = imabsdiff(fondo_gray, frame_gray);
% Umbralizar para obtener la región del corredor
threshold = 20; % Ajusta este valor según sea necesario
mask = diff > threshold;
% Aplicar operaciones morfológicas para refinar la máscara
mask = imdilate(mask, strel('disk', 5)); % Dilatación ajustada
mask = imfill(mask, 'holes'); % Rellenar agujeros
mask = imerode(mask, strel('disk', 3)); % Erosión ajustada
mask = imopen(mask, strel('disk', 3)); % Apertura ajustada
% Crear una máscara RGB para la imagen actual
mask_rgb = repmat(mask, [1, 1, 3]);
% Superponer la silueta de la persona en la imagen final
% Solo reemplazar los píxeles donde la máscara es verdadera y la imagen final aún tiene el fondo
fondo_mask = repmat(rgb2gray(imagen_final) == rgb2gray(fondo), [1, 1, 3]);
imagen_final(mask_rgb & fondo_mask) = frame(mask_rgb & fondo_mask);
end
% Mostrar la imagen final con la secuencia de movimiento
figure;
imshow(imagen_final);
title('Imagen final con la secuencia de movimiento');
///Pero solo logra mostrar las dos primeras siluetas, las demas no las muestra. Quiero lograr mostrar las 4 o 5 secuencias completas del sujeto

回答(1 个)

Madheswaran
Madheswaran 2024-9-3
Hello,
I've executed your code using the source video available at https://www.pexels.com/video/a-woman-running-on-the-pavement-of-a-river-bank-3048930/. Upon reviewing the results, it appears that the masks you've implemented do not precisely isolate the object of interest rather included a significant portion of the surrounding area as illustrated in the below figure. This can be observed by visualizing the mask with `imshow(mask)` across different iterations. Below are the images of the ‘mask’ and 'fondo_mask':
Since you're only updating pixels where the ‘fondo_mask’ is true, the frames starting from the second iteration of the loop end up distorted.
Given that both the object and background are not simple objects, a straightforward approach of calculating the difference between two grayscale images might not be sufficient. I suggest trying out different image segmentation algorithms using the 'Image Segmenter' App on a single frame to find the most suitable algorithm for your case. Once you identify the algorithm, you can integrate it into your code using the 'generate function' feature of the app.
Refer to the following documentations for information regarding:
  1. Image Segmenter App - https://mathworks.com/help/images/image-segmentation-using-the-image-segmenter-app.html
  2. Summary of different image segmentation algorithms provided by MATLAB - https://mathworks.com/discovery/image-segmentation.html
Hope this helps!

类别

Help CenterFile Exchange 中查找有关 Image Processing and Computer Vision 的更多信息

产品


版本

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by