Я пытаюсь прочитать видеофайл и сохранить кадры в виде серии изображений. Я использую VideoReader, но по некоторым причинам у меня проблемы. Я хочу сохранить кадры двух видео, закодированных по-разному, и измерить структурное сходство и PSNR между ними по кадрам.
По сути, у меня есть три видеофайла, оригинальный (который хорошо читается), один сжатый с помощью VP9 с использованием ffmpeg, а другой сжатый с использованием H.624 с использованием ffmpeg. Первоначально видео было просто набором кадров, слитых в видео .avi с использованием VirtualDub. Сжатые видео также являются контейнером .avi.
Казалось, что видео VP9 работает нормально, но когда я открываю изображения с помощью imshow (), они выглядят просто сплошным зеленым цветом. Видео открывается нормально на VLC, поэтому я не уверен, в чем проблема.
Видео H.264 вообще не читается. Когда он пытается войти в цикл «while hasFrame ()», он пропускает его, что приводит к убеждению, что Matlab считает, что видеокадров нет? Опять же, это видео открывается нормально в VLC, и три видео выглядят почти одинаково.
У кого-нибудь есть идеи, почему это происходит? Это связано с тем, как Matlab декодирует видео или некоторые параметры, установленные ffmpeg?
Оригинал против VP9 в Matlab
Консольный выход для ffmpeg - VP9
Консольный выход для ffmpeg - H264
Основной файл:
test_vid = 'vp9.avi';
images = readVideos(test_vid);
for i=1:length(images)
% Convert from cells to matrices
image1 = cell2mat(images(1,i));
image2 = cell2mat(images(2,i));
% Do stuff with the images here
subplot(1,2,1);
imshow(image1);
subplot(1,2,2);
imshow(image2);
end
ReadVideos ():
function images = readVideos(test_video)
% Video directories
test_video_dir = strcat('src/', test_video);
v_original = VideoReader('src/input.avi');
v_test = VideoReader(test_video_dir);
% Read original video
i = 1;
v_original.CurrentTime = 5;
while hasFrame(v_original)
frame = readFrame(v_original);
originalImages{i} = frame;
i = i + 1;
end
% Read test video
i = 1;
v_test.CurrentTime = 5;
while hasFrame(v_test)
frame = readFrame(v_test);
testImages{i} = frame;
i = i + 1;
end
images = cat(1, originalImages, testImages);
end
Кстати, Matlab - лучший выбор для этой задачи или есть специализированное программное обеспечение для этого?