Я пытаюсь прочитать видеофайл и сохранить кадры в виде серии изображений. Я использую VideoReader, но по какой-то причине у меня возникают проблемы. Я хочу хранить кадры двух видео, закодированных по-разному, и измерять структурное сходство и PSNR между ними на покадровой основе.
По сути, у меня есть три видеофайла: оригинал (который читается нормально), один сжат с помощью VP9 с использованием ffmpeg и один сжат с помощью H.624 с использованием ffmpeg. Исходное видео изначально было просто набором кадров, объединенных в видео .avi с помощью VirtualDub. Сжатые видео также являются контейнером .avi.
Видео VP9, казалось, работало нормально, но когда я открываю изображения с помощью imshow(), они выглядят просто сплошным зеленым цветом. Видео отлично открывается на VLC, поэтому я не уверен, в чем проблема.
Видео H.264 вообще не читает. Когда он пытается войти в цикл «пока 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
Прочитатьвидео():
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 — лучший выбор для этой задачи или для этого есть специализированное программное обеспечение?