Matlab VideoReader 将帧读取为绿色图像或根本不读取

标签 matlab image-processing ffmpeg video-processing codec

我正在尝试读取视频文件并将帧存储为一系列图像。我正在使用 VideoReader,但由于某种原因我遇到了麻烦。我想存储两个以不同方式编码的视频的帧,并逐帧测量两者之间的结构相似性和 PSNR。

基本上我有三个视频文件,一个原始文件(读起来很好),一个使用 ffmpeg 用 VP9 压缩,一个使用 ffmpeg 用 H.624 压缩。原始视频最初只是使用 VirtualDub 将一组帧合并成一个 .avi 视频。压缩视频也是 .avi 容器。

VP9 视频似乎工作正常,但是当我使用 imshow() 打开图像时,它们似乎只是纯绿色。该视频在 VLC 上打开正常,所以我不确定问题是什么。

H.264 视频根本无法读取。当它试图进入“while hasFrame()”循环时,它会跳过它,这导致相信 Matlab 认为视频帧不存在?同样,该视频在 VLC 中打开良好,三个视频看起来几乎相同。

有人知道为什么会这样吗?是和matlab解码视频的方式还是ffmpeg设置的一些参数有关?

Original vs VP9 in Matlab

Console output for ffmpeg - VP9

Console output for 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 是完成这项任务的最佳选择,还是有专门的软件可以做到这一点?

最佳答案

Matlab 的 Videoreader 依赖于 most part , 在操作系统提供的解码器上。一般来说,这些解码器对像素格式的流的支持有限,而不是最常见的格式。这里似乎就是这种情况。

你的 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#psnrhttp://www.ffmpeg.org/ffmpeg-filters.html#ssim

关于Matlab VideoReader 将帧读取为绿色图像或根本不读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55952624/

相关文章:

MATLAB 加速打开命令

matlab - 将匿名函数与 feval 一起使用

matlab - 训练神经网络 matlab 后的预测

r - R 中的热图颜色

javascript - 不能将 jimp 与 webpack 一起使用

c++ - 加载、裁剪和保存 jpg C++

ios - 尝试使用 armv6 和 arv7 架构为 iPhoneOS 平台编译 FFMPEG 库

image-processing - Scikit-image 扩展事件轮廓(蛇)

linux - 如何使用 shell 脚本对文件对运行多个命令?

video - 使用 FFmpeg 创建缩略图