每10秒从视频文件中捕获一帧。

5

我想从视频文件中每隔10秒捕获一帧,如果有人能帮助我,我将非常感激。我的Python代码如下:

import cv2


print(cv2.__version__)
vidcap = cv2.VideoCapture('Standoff.avi')
vidcap.set(cv2.CAP_PROP_POS_MSEC,96000)  
success,image = vidcap.read()
count = 0
success = True
while success:
  success,image = vidcap.read()
  print 'Read a new frame: ', success
  cv2.imwrite("frame%d.jpg" % count, image)     # save frame as JPEG file
  cv2.waitKey(200)
  count += 1

您能解释一下您当前代码遇到的问题吗? - Mick
3个回答

9

在这里,我进行了10个帧的转换后捕获帧。您可以使用时间函数,并类似地在if条件语句中捕获帧。

import cv2

vidcap = cv2.VideoCapture('testing.mp4')
count = 0
success = True
fps = int(vidcap.get(cv2.CAP_PROP_FPS))

while success:
    success,image = vidcap.read()
    print('read a new frame:',success)
    if count%(10*fps) == 0 :
         cv2.imwrite('frame%d.jpg'%count,image)
         print('successfully written 10th frame')
    count+=1

1
你正在捕获十分之一的帧,但没有考虑它的FPS,因此你可以在任何时间保存十分之一的帧。为此,你必须考虑FPS。 - Rodrigo Laguna
感谢@RodrigoLaguna的上述评论。我希望现在它是正确的。 - amaresh hiremani

5
如果您可以从文件中获取视频的帧速率,则以下内容应该有效(您可能需要检查语法,因为我没有测试它):
import cv2

cap = cv2.VideoCapture('Standoff.avi')
framerate = cap.get(cv2.cv.CV_CAP_PROP_FPS)
framecount = 0

while(True):
    # Capture frame-by-frame
    success, image = cap.read()
    framecount += 1

    # Check if this is the frame closest to 10 seconds
    if framecount == (framerate * 10)
      framecount = 0
      cv2.imshow('image',image)

    # Check end of video
    if cv2.waitKey(1) & 0xFF == ord('q'):
          break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

非常感谢,这给了我一个解决方案的想法。 - ucmou
Numpy 没有被使用。 - Pedro Lobito
1
@PedroLobito - 发现得好。已更新。 - Mick

0

你应该使用这段代码。代码获取fps并将其乘以10,这定义了10秒视频创建多少帧。我们称之为乘数。脚本捕获第一帧并将帧计数器乘以乘数。脚本每10秒捕获一帧。

import cv2 as cv
import os
from time import time

file = "videos/mouthwash.avi"

if not os.path.isfile(file):
print("File not found!")

# images forder name
folder_name = base=os.path.basename(file) + " frames"

# create folder for images in current path if not exists
current_path = os.getcwd()
folder_path = os.path.join(current_path, folder_name)

if not os.path.exists(folder_path):
    os.mkdir(folder_path)

cap = cv.VideoCapture(file)

total_frame = int(cap.get(cv.CAP_PROP_FRAME_COUNT))

# save frame every # seconds
seconds = 10
fps = cap.get(cv.CAP_PROP_FPS) # Gets the frames per second
# calculates number of frames that creates 10 seconds of video
multiplier = fps * seconds

# Check if camera opened successfully
if (cap.isOpened()== False):
    print("Error opening video stream or file")

frame_counter = 1

while frame_counter <= total_frame:

    cap.set(cv.CAP_PROP_POS_FRAMES, frame_counter)

    ret, frame = cap.read()

    # save frame
    # file path
    file_path = os.path.join(folder_path, str(time()) + ".jpg")
    cv.imwrite(file_path, frame)

    frame_counter += multiplier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接