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
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:
- Image Segmenter App - https://mathworks.com/help/images/image-segmentation-using-the-image-segmenter-app.html
- Summary of different image segmentation algorithms provided by MATLAB - https://mathworks.com/discovery/image-segmentation.html
Hope this helps!
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Image Processing and Computer Vision에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!