我的任务是创建一个可以在几秒钟内拍摄视频和时间的实用程序。
该实用程序应该使用给定的输入从视频中写出jpeg图像。
E.g。让视频名称为abc.mpeg
,并将时间作为20
秒提供给工具。该实用程序应该从视频@20秒中写出图像。
# Import the necessary packages
import argparse
import cv2
vidcap = cv2.VideoCapture('Wildlife.mp4')
success,image = vidcap.read()
count = 0;
while success:
success,image = vidcap.read()
cv2.imwrite("frame%d.jpg" % count, image) # save frame as JPEG file
if cv2.waitKey(10) == 27: # exit if Escape is hit
break
count += 1
以上代码给出了整个视频的所有帧,我关心的是如何在指定时间传递时间并获取帧?
答案 0 :(得分:11)
你为什么不这样做,@ micka提出了什么?
import cv2
vidcap = cv2.VideoCapture('d:/video/keep/Le Sang Des Betes.mp4')
vidcap.set(cv2.CAP_PROP_POS_MSEC,20000) # just cue to 20 sec. position
success,image = vidcap.read()
if success:
cv2.imwrite("frame20sec.jpg", image) # save frame as JPEG file
cv2.imshow("20sec",image)
cv2.waitKey()
答案 1 :(得分:0)
# Import the necessary packages
import cv2
vidcap = cv2.VideoCapture('Wildlife.mp4')
success,image = vidcap.read()
print success
#cv2.imwrite("frame.jpg", image)
count = 0
framerate = vidcap.get(5)
print "framerate:", framerate
framecount = vidcap.get(7)
print "framecount:", framecount
vidcap.set(5,1)
newframerate = vidcap.get(5)
print "newframerate:", newframerate
while success:
success,image = vidcap.read()
#cv2.imwrite("frame%d.jpg" % count, image)
getvalue = vidcap.get(0)
print getvalue
if getvalue == 20000:
cv2.imwrite("frame%d.jpg" % getvalue, image)
#if cv2.waitKey(10) == 27:
#break
count += 1
输出如下
framerate: 29.97002997
framecount: 901.0
newframerate: 29.97002997
为什么帧速率没有变化。我想将帧速率更改为1,这样无论用户给出的任何时间值,我都应该能够获得图像帧。
答案 2 :(得分:0)
import cv2
cap = cv2.VideoCapture('bunny.mp4')
cap.set(cv2.CAP_PROP_POS_MSEC,1000) # Go to the 1 sec. position
ret,frame = cap.read() # Retrieves the frame at the specified second
cv2.imwrite("image.jpg", frame) # Saves the frame as an image
cv2.imshow("Frame Name",frame) # Displays the frame on screen
cv2.waitKey() # Waits For Input
此处, cap.set(cv2.CAP_PROP_POS_MSEC,1000) 负责直接跳至视频中的第1秒(1000毫秒)。随意替换您选择的价值。
我在OpenCV 3.1.0上测试了代码。