2016-02-11 14 views
3

我有一個問題與Matlab r2015a。當我運行這段代碼,它把我的電腦Matlab VideoReader採取意想不到的時間

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; 

在1.7 secondes但是當我運行此另一方面,它需要14.9 secondes:

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

+0

我不能複製您的時間在OS X上使用R2015a或R2015b。第一個代碼約需11秒,第二個約22秒。 – horchler

回答

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); 
+1

由於框架是逐步讀取的,沒有跳過,所以使用非棄用的'readFrame'可能會更好(也更快)。 – horchler

+1

非常感謝Daniel對我們的解釋和示例代碼,它的運行速度比我的scrpit更快(1.4s),只讀一幀... 我還會看看readFrame。 – Hub