Matlab VideoReader считывает кадры как зеленые изображения или вообще не читает

Я пытаюсь прочитать видеофайл и сохранить кадры в виде серии изображений. Я использую 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 — лучший выбор для этой задачи или для этого есть специализированное программное обеспечение?


person Jordan    schedule 02.05.2019    source источник


Ответы (1)


Средство видеочтения Matlab полагается в большей части , на декодерах, предоставляемых ОС. Как правило, эти декодеры имеют ограниченную поддержку потоков с форматами пикселей, отличными от наиболее распространенных. Похоже, здесь дело обстоит именно так.

Ваш выход VP9 — gbrp, то есть планарный (8-битный) RGB. Ваш выход H.264 - YUV, но с выборкой цветности 4: 4: 4. Оба они нестандартные.

Чтобы прочитать эти файлы с помощью Videoreader, преобразуйте их в стандартный формат пикселей:

ffmpeg -i input.avi -pix_fmt yuv420p -c:v libvpx-vp9 vp9.avi

и

ffmpeg -i input.avi -pix_fmt yuv420p -c:v libx264 h264.avi

Однако вы можете столкнуться с проблемами при сравнении метрик качества, поскольку они требуют, чтобы оба операнда имели одинаковый формат пикселей. Matlab может или не может конвертировать их автоматически.


Вы можете просто выполнить проверку качества в ffmpeg.

ffmpeg -i input.avi -pix_fmt gbrp -c:v libvpx-vp9 vp9.mkv

и

ffmpeg -i input.avi -pix_fmt gbr24 -c:v libx264rgb h264.mkv

А потом

ffmpeg -i input.avi -i vp9.mkv -i h264.mkv -filter_complex "[1][0]psnr=f=vp9-psnr.txt:stats_version=2;[1][0]ssim=f=vp9-ssim.txt;[2][0]psnr=f=h264-psnr.txt:stats_version=2;[2][0]ssim=f=h264-ssim.txt" -f null -

См. http://www.ffmpeg.org/ffmpeg-filters.html#psnr и http://www.ffmpeg.org/ffmpeg-filters.html#ssim

person Gyan    schedule 02.05.2019
comment
Привет, Гьян, спасибо за ответ! Ваше решение отлично работает для H264, однако у меня все еще возникает та же проблема с VP9, ​​есть какие-нибудь мысли? Кроме того, спасибо за ваше второе предложение, это отличный способ сделать это, и благодаря этому я получаю результаты для VP9. Результаты проверки качества (по крайней мере, для H264) от Matlab и ffmpeg немного отличаются (около 4/5% для SSIM), есть мысли о том, какой метод более надежен? - person Jordan; 02.05.2019
comment
У меня все еще возникает та же проблема с VP9, ​​есть какие-нибудь мысли? --› Я думаю, что не установлен декодер Directshow/Windows Media Foundation для VP9. - person Gyan; 02.05.2019
comment
Matlab выполнит некоторое преобразование формата пикселей - либо на эталоне, либо на транскодированном видео. Я бы придерживался фильтра ffmpeg. - person Gyan; 02.05.2019