【问题标题】:capture one frame from a video file after every 10 seconds每 10 秒后从视频文件中捕获一帧
【发布时间】:2016-09-21 16:50:15
【问题描述】:

我想在每 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

【问题讨论】:

  • 您能解释一下您当前的代码遇到的问题吗?

标签: python video video-capture


【解决方案1】:

这里我是在帧转换 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

【讨论】:

  • 您正在捕获十分之一的帧,但您没有考虑其 FPS,因此您可以随时保存十分之一的帧。为此,您必须考虑使用 FPS
  • 感谢@RodrigoLaguna 的上述评论。我希望现在它是正确的。
【解决方案2】:

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

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()

【讨论】:

  • 非常感谢,它让我了解了解决方案。
  • 没有使用 Numpy
  • @PedroLobito - 很好发现。已更新。
【解决方案3】:

您应该使用此代码。代码获取 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多