Matlab VideoReader花费了意想不到的时间

时间:2016-02-11 19:24:35

标签: matlab

我对Matlab r2015a有一个问题。当我运行此代码时,我的计算机需要1.7秒才能

clc;
clear all;
close all;
tic
Video = VideoReader('test_E.avi');
for k = 1:1:100
 GrayImage0 = rgb2gray(read(Video, k));
end
imshow(GrayImage0);
elapsedTime = toc;

但是,当我运行另一个时,它需要14.9秒:

clc;
clear all;
close all;
tic
Video = VideoReader('test_E.avi');
for k = 1:1:100
 GrayImage0 = rgb2gray(read(Video, k));
 GrayImage1 = rgb2gray(read(Video, k+1));
end
imshow(GrayImage0);
elapsedTime = toc;

我预计只需3.4秒(每个循环只需再读一张图像)。 我是新手,我希望有人能帮我解决这个问题...... 视频文件可以在这里找到: https://drive.google.com/file/d/0B6Kk7k9hLvjlbzZuQlJfRlpmZXM/view?usp=sharing

1 个答案:

答案 0 :(得分:3)

使用典型的视频编解码器,您无法单独解码帧,解码始终从关键帧开始。让我们假设关键帧是1,11,21,......虽然真正的策略可能稍微高一些,但假设前10帧被一次解码并放入缓存,假设第2帧到第10帧在阅读第1帧之后需要稍微一点。这意味着您需要以处理1个关键帧和9个不同帧的价格获得10帧。

现在你的循环,第一次迭代帧1和2被读取并可能从缓存中删除(谁希望有人两次读取同一帧?)。现在你读到第2帧和第3帧,找不到2,所以解码必须重新开始。对于你阅读第10帧和第11帧的第10次迭代,情况更糟。编解码器可能先前丢帧10,因此帧1到10再次被解码。使这个单个最后一个循环比按顺序读取整个10帧更昂贵,处理2个关键帧和9个差异帧。

总结:尽量坚持视频代码优化的用例,尽可能按顺序读取帧并将帧存储在您身边:

Video = VideoReader('test_E.avi');
GrayImage1 = rgb2gray(read(Video, 1));
for k = 1:1:100
 GrayImage0 = GrayImage1;
 GrayImage1 = rgb2gray(read(Video, k+1));
end
imshow(GrayImage0);