【问题标题】:How can I learn the starting time of each frame in a video?如何了解视频中每一帧的开始时间?
【发布时间】:2016-10-24 13:14:55
【问题描述】:

了解视频每一帧的开始时间非常关键。 我需要使用下面的 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

我想要的是通过使用直方图将某些视频帧与其他视频帧区分开来。最后,我的目标是达到杰出帧的确切显示时间。

编辑后: 这是帧直方图输出:

某些帧的直方图大小与上一个不同,您知道原因吗?

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

由于我已经删除了不同直方图大小的帧,但它会导致丢失一些帧。

【问题讨论】:

  • 只是为了澄清问题:您有一段视频显示某些内容(例如黑屏)一段时间,然后发生剪辑,可以使用直方图找到并且您希望自动找到它,对?你能给一个示例视频文件吗?这将非常有帮助
  • 是的。不幸的是,由于某些版权问题,我无法分享视频。视频由第一个场景中的人脸和背景是黑色的,在第二个场景中有一些文字和背景是深白色的,最后第三个场景是空白的,背景也是深白色的。你能回答一下随机视频吗?

标签: image matlab video frame


【解决方案1】:

我还没有找到一个看起来像你描述的视频示例。请考虑总是有一个例子。

此示例代码计算历史计数中的差异。请注意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)]);

【讨论】:

  • 感谢您的帮助@Finn,它有效。但是我怎样才能确定每一帧的确切时间呢?并且在直方图上应该不止一个选取点,我的意思是不止一个区分帧和它们的显示时间。
  • 关于时间(我假设您的意思是以秒为单位):如果您知道视频的帧率,您可以简单地通过帧数/帧率来计算它。但我不确定有关帧速率的信息是否存储在文件中。多重区分很容易,但您必须显示差异的条形图。这些不受版权保护
  • 我已经回答了主要问题。谢谢芬恩。
  • 直方图大小取决于值的范围。 RGB 的值在 [0,255] 范围内,但如果图片的值在 [0,200] 范围内,则直方图也只有该大小。我编辑了我的答案代码,所以应该解决这个问题。关于您的多个可区分帧:我不知道正确的帧在哪里,但例如您可以设置一个阈值。我也在我的代码末尾添加了这一点
猜你喜欢
  • 1970-01-01
  • 2018-05-24
  • 2013-12-13
  • 1970-01-01
  • 2018-07-07
  • 2018-05-26
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多