user951487
user951487

Reputation: 855

How can I learn the starting time of each frame in a video?

It is very critical to learn the start time of each frame of a video. I need to determine the starting point manually ( for example 848 here) by using below matlab code:

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

What I want is to distinguish some video frame from the others by using histogram. At the end my aim is to reach the exact showing time of the distinguished frames.

After editting: This is frame histogram outputs: enter image description here

Histogram size of the some frames are different from the previous one, do you know the reason?

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

Because of the taking the difference of the I had remove the different histogram sized frames but it causes missing some frames.

Upvotes: 0

Views: 138

Answers (1)

Finn
Finn

Reputation: 2343

i havent found an video example that looks like what you discribe. please condsider always to have an example.

This example code calculates the differences in the histcounts. please notice that waitforbuttonpressis in the loop so you have to click for each frame while testing or remove it when the video is too long. Does this works on your file?

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)]);

Upvotes: 1

Related Questions