Python-提取和保存视频帧

2024-03-29 13:08:05 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我跟踪了this tutorial但它似乎什么也没做。什么都没有。它等待几秒钟并关闭程序。这个代码有什么问题?

import cv2
vidcap = cv2.VideoCapture('Compton.mp4')
success,image = vidcap.read()
count = 0
success = True
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

另外,在评论中,它说这限制了1000帧?为什么?

编辑: 我试着先做success = True但没用。它只创建了一个0字节的图像。


Tags: 代码imageimporttruereadifcountthis
3条回答

here下载这个video以便我们有相同的测试视频文件。确保mp4文件位于python代码的同一目录中。然后还要确保从同一目录运行python解释器。

然后修改代码,抛弃那些浪费时间的代码,如果没有窗口,它也无法捕获键盘事件。此外,我们还打印success值,以确保它成功读取帧。

import cv2
vidcap = cv2.VideoCapture('big_buck_bunny_720p_5mb.mp4')
success,image = vidcap.read()
count = 0
while success:
  cv2.imwrite("frame%d.jpg" % count, image)     # save frame as JPEG file      
  success,image = vidcap.read()
  print('Read a new frame: ', success)
  count += 1

怎么样?

所以这是最终的密码:

import cv2
print(cv2.__version__)
vidcap = cv2.VideoCapture('big_buck_bunny_720p_5mb.mp4')
success,image = vidcap.read()
count = 0
success = True
while success:
  cv2.imwrite("frame%d.jpg" % count, image)     # save frame as JPEG file
  success,image = vidcap.read()
  print ('Read a new frame: ', success)
  count += 1

所以要想成功,你得买点东西。首先,download OpenCV2。然后install this for Python2.7.x.转到第三方文件夹中的FFmpeg文件夹(类似于C:\OpenCV\3rdparty\ffmpeg,但我不确定)。复制opencv_ffmpeg.dll(如果python版本是x64,则复制x64版本)并将其粘贴到python文件夹中(可能是C:\Python27)。如果您的OpenCV版本是3.0.0(您可以找到它),请将其重命名为opencv_ffmpeg300.dll,并根据您的版本进行相应的更改。顺便说一下,你必须有你的python folder in your environment path

如果有人不想提取每一帧,而是想每隔一秒钟提取一帧,则可以将此问题(由@user2700065回答)扩展到稍微不同的情况。因此,1分钟的视频将提供60帧(图像)。

import sys
import argparse

import cv2
print(cv2.__version__)

def extractImages(pathIn, pathOut):
    count = 0
    vidcap = cv2.VideoCapture(pathIn)
    success,image = vidcap.read()
    success = True
    while success:
      vidcap.set(cv2.CAP_PROP_POS_MSEC,(count*1000))    # added this line 
      success,image = vidcap.read()
      print ('Read a new frame: ', success)
      cv2.imwrite( pathOut + "\\frame%d.jpg" % count, image)     # save frame as JPEG file
      count = count + 1

if __name__=="__main__":
    print("aba")
    a = argparse.ArgumentParser()
    a.add_argument("--pathIn", help="path to video")
    a.add_argument("--pathOut", help="path to images")
    args = a.parse_args()
    print(args)
    extractImages(args.pathIn, args.pathOut)

相关问题 更多 >