Matlab VideoReader считывает фреймы как зеленые картинки или просто не совсем - PullRequest
1 голос
/ 02 мая 2019

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

1 Ответ

1 голос
/ 02 мая 2019

Videoreader 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

...