我的目标是阅读视频文件并使用图像文件上的函数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()是如何工作的。它只读取第一帧吗?怎样才能及时前进。是否可以为我们想要获得的帧分配开始时间和结束时间?
答案 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