如何使用OpenCV-pythons获取所有帧?

时间:2018-03-20 19:42:21

标签: python opencv

我的目标是阅读视频文件并使用图像文件上的函数cv2.imread()获取所有帧。

我已经阅读了教程 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html

并找到了一个密切相关的帖子

Python - Extracting and Saving Video Frames

但是我不明白vidcap.read()是如何工作的。它只读取第一帧吗?怎样才能及时前进。是否可以为我们想要获得的帧分配开始时间和结束时间?

1 个答案:

答案 0 :(得分:0)

cv2.vidcap()将一次读取一帧,需要再次调用以读取后续帧。这就是相关帖子中的while循环正在做的事情。请记住,第一帧被丢弃,因此保存的第一个图像将是帧#2。我评论了您链接的帖子中的代码:

# this is the video capture object
vidcap = cv2.VideoCapture('big_buck_bunny_720p_5mb.mp4')

# this reads the first frame
success,image = vidcap.read()
count = 0
success = True

# so long as vidcap can read the current frame... 
while success:

  # ...read the next frame (this is now your current frame)
  success,image = vidcap.read()
  count += 1 # moved this to be accurate with my 'second frame' statement
  print('Read a new frame: ', success)

  # this is where you put your functionality (this just saves the frame)
  cv2.imwrite("frame%d.jpg" % count, image)     # save frame as JPEG file

为了设置开始和结束时间,据我所知,您需要获得视频的帧速率(即30 fps)并推断您想要开始的帧编号是什么。所以说你想在10秒开始,然后你会在while循环中使用条件,或者在fps = 30 # there is an opencv function to determine this start = 15 # seconds end = 45 # seconds while success: success,image = vidcap.read() count += 1 if count =< end and count >= start # do something 循环旁边使用条件,这样你就可以控制你想要的帧。最后一帧也是如此。所以如果你有一个1分钟的视频,只想要中间三十秒:

fork