2016-10-24 2 views
0

Очень важно узнать время начала каждого кадра видео. мне нужно, чтобы определить начальную точку вручную (например, 848 здесь), используя ниже MatLab код:Как узнать время начала каждого кадра в видео?

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 

То, что я хочу, чтобы отличить некоторые видеокадра от других с помощью гистограммы. В конце моя цель - достичь точного времени показа выделенных кадров.

После editting: Это кадр гистограмма выходы: enter image description here

Гистограмма размер некоторых кадров отличается от предыдущего, вы знаете причину?

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

Из-за использования разницы в I было удалить различные рамки размера гистограммы, но это вызывает отсутствуют некоторые кадры.

+0

просто убрать вещи: у вас есть видео, которое показывает что-то (например, черный экран) в течение некоторого времени, а затем вырезать случается, что можно найти с помощью гистограмм и вы хотите, чтобы найти automaticallly, верно? Можете ли вы привести пример видеофайла? что было бы очень полезно – Finn

+0

Да точно. К сожалению, я не могу поделиться видео из-за некоторых проблем с авторским правом. Видео состоит из первой сцены, лицо человека и фон черного цвета, во второй сцене есть текст, а задний фон темно-белый, а окончательная третья сцена пуста, а фон снова темно-белый. Не могли бы вы ответить на него случайно? – user951487

ответ

1

i havent нашел видео-пример, похожий на то, что вы описываете. пожалуйста, всегда делайте пример.

В этом примере кода вычисляются различия в значениях histcounts. обратите внимание, что waitforbuttonpress находится в цикле, поэтому вам нужно щелкнуть по каждому кадру во время тестирования или удалить его, когда видео слишком длинное. Это работает в вашем файле?

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

относительно времени (предположим, вы имеете в виду в секундах): если вы знаете частоту кадров вашего видео, вы можете просто вычислить ее с помощью frameenumber/framerate. но я не уверен, что информация о частоте кадров хранится внутри файла. множественное распознавание легко, но вам нужно будет показать штрих-график различий. Это не защищено авторскими правами – Finn

+0

Я ответил в основном вопросе. Спасибо, Финн. – user951487

Смежные вопросы