【问题标题】:Extracting image from video at a given time using OpenCV使用 OpenCV 在给定时间从视频中提取图像
【发布时间】:2015-02-13 10:16:12
【问题描述】:

我的任务是制作一个可以在几秒钟内拍摄视频和时间的实用程序。

该实用程序应使用给定的输入从视频中写出 jpeg 图像。

例如让视频名称为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

上面的代码给出了整个视频的所有帧,我关心的是如何打发时间并在指定时间获取帧?

【问题讨论】:

  • 在 C++ 中,您可以使用 vidcap.set(CV_CAP_PROP_POS_MSEC, 20000); 将捕获设置为位置 20 秒 = 20000 毫秒。在 python 中,它可能看起来非常相似。如果您想在给定时间后停止,可以使用vidcap.get(CV_CAP_PROP_POS_MSEC) 询问当前位置。

标签: python image opencv video computer-vision


【解决方案1】:
# 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,以便用户给出的任何时间值我都应该能够获得图像帧。

【讨论】:

  • 正如@Micka 所说要更改帧速率,我尝试设置帧速率但它没有改变。
【解决方案2】:

你为什么不直接做,@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()                    

【讨论】:

  • 谢谢,现在我明白了。我们也应该使用 vidcap.set(0,20000) 代替 CAP_PROP_POS_MSEC
  • ^^ 啊,对不起,在 3.0 上试过,常量更一致。它可能是 cv2.cv.CAP_PROP_POS_MSEC 和 opencv2.4
【解决方案3】:
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)负责直接跳到视频的第一秒(第1000毫秒)。随意替换您选择的值。

我已经在 OpenCV 3.1.0 上测试过代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多