2016-10-24 91 views
0

瞭解視頻每幀的開始時間非常關鍵。 我需要使用下面的MATLAB代碼手動確定起始點(例如848這裏):我如何學習視頻中每個幀的開始時間?

v = VideoReader('video1.avi','CurrentTime',848); 
while hasFrame(v) 
    video_frame = readFrame(v); 
    counter=counter+1; 

    if counter==1 
     imshow(video_frame) 
     imhist(video_frame(:,:,1)) 
    end 
end 

我要的是用直方圖來區分與其他一些視頻幀。最後,我的目標是達到尊貴幀的確切展示時間。

編輯工作後: 這架直方圖輸出: enter image description here

的一些幀的直方圖大小與以前的不同,你知道原因嗎?

 difference=[difference sum(abs(histcounts(video_frame)-histcounts(lastframe)))]; 

因爲服用我的差異有去除不同直方圖大小的幀,但它會導致缺少某些幀。

+0

只是爲了澄清一些事情:你有顯示的東西(例如黑屏)一段時間的視頻,然後切發生,可以使用直方圖可以找到你想要的是被automaticallly發現,對不對?你能舉一個例子視頻文件嗎?這將是超級有用 – Finn

+0

是的。很遺憾,由於版權問題,我無法分享視頻。視頻由第一個場景中的人臉和背景爲黑色,第二個場景中有一些文本,背景爲深白色,最後的第三個場景爲空白,背景又是深色的白色。你能回答一個隨機視頻嗎? – user951487

回答

1

我還沒有找到一個視頻示例,看起來像你描述的。請考慮一下,舉個例子。

本示例代碼計算了統計記錄的差異。請注意0​​處於循環狀態,因此您必須在測試時單擊每一幀,或在視頻過長時將其刪除。這對你的文件有效嗎?

v = VideoReader('sample.avi','CurrentTime',1); 
figure1=figure('unit','normalized','Position',[0.2 0.2 0.4 0.6]); 
axes1=subplot(3,1,1); 
axes2=subplot(3,1,2); 
axes3 = subplot(3,1,3); 

counter=0; 
difference=[]; 
video_frame=readFrame(v); 
while hasFrame(v) 
    lastframe=video_frame; 
    video_frame = readFrame(v); 
    counter=counter+1; 

    imshow(video_frame,'Parent',axes1); 
    [a,b]=histcounts(video_frame(:,:,1)); 
    plot(b(1:end-1),a,'Parent',axes2); 

    difference=[difference sum(abs(histcounts(video_frame,0:255)-histcounts(lastframe,0:255)))]; 
    bar(1:counter,difference,'Parent',axes3); 
    waitforbuttonpress 
end 
    [~,onedistinguished]=max(difference); 
    %defining a threshold like every value that is bigger 4000 
    multidistinguished=find(difference>4000); 

    disp(['majorly changed at: ' num2str(distinguished)]); 
+0

感謝您的幫助@Finn,它的工作原理。但是,我怎樣才能確定每個幀的確切時間?它應該是直方圖上的一個以上的選取點,我的意思是不止一個傑出的幀和它們的顯示時間。 – user951487

+0

關於時間(我假設你的意思是秒):如果你知道你的視頻的幀率,你可以簡單地通過framenumber/framerate來計算它。但我不確定關於幀率的信息是否存儲在文件中。多個區別很容易,但你必須顯示差異的條形圖。那些不受版權保護 – Finn

+0

我已在主要問題中回答。謝謝芬蘭人。 – user951487