python花式提取视频图片

# -*- coding: utf-8 -*-
import os
import cv2  ##加载OpenCV模块

def video2frames(pathIn='',
                 pathOut='',
                 only_output_video_info=False,
                 extract_time_points=None,
                 initial_extract_time=0,
                 end_extract_time=None,
                 extract_time_interval=-1,
                 output_prefix='frame',
                 jpg_quality=100,
                 isColor=True):
    '''
	  pathIn:视频的路径,比如:F:\python_tutorials\test.mp4
	  pathOut:设定提取的图片保存在哪个文件夹下,比如:F:\python_tutorials\frames1\。如果该文件夹不存在,函数将自动创建它
	  only_output_video_info:如果为True,只输出视频信息(长度、帧数和帧率),不提取图片
	  extract_time_points:提取的时间点,单位为秒,为元组数据,比如,(2, 3, 5)表示只提取视频第2秒, 第3秒,第5秒图片
	  initial_extract_time:提取的起始时刻,单位为秒,默认为0(即从视频最开始提取)
	  end_extract_time:提取的终止时刻,单位为秒,默认为None(即视频终点)
	  extract_time_interval:提取的时间间隔,单位为秒,默认为-1(即输出时间范围内的所有帧)
	  output_prefix:图片的前缀名,默认为frame,图片的名称将为frame_000001.jpg、frame_000002.jpg、frame_000003.jpg......
	  jpg_quality:设置图片质量,范围为0到100,默认为100(质量最佳)
	  isColor:如果为False,输出的将是黑白图片
	  '''
	
	  cap = cv2.VideoCapture(pathIn)  ##打开视频文件
	  if (cap.isOpened()):
	      n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  ##视频的帧数
	      fps = cap.get(cv2.CAP_PROP_FPS)  ##视频的帧率
	      dur = n_frames / fps  ##视频的时间
	  else:
	      print('错误,没有读入视频!')
	
	  ##如果only_output_video_info=True, 只输出视频信息,不提取图片
	  if only_output_video_info:
	      print('only output the video information (without extract frames)::::::')
	      print("Duration of the video: {} seconds".format(dur))
	      print("Number of frames: {}".format(n_frames))
	      print("Frames per second (FPS): {}".format(fps))
	
	      ##提取特定时间点图片
	  elif extract_time_points is not None:
	      if max(extract_time_points) > dur:  ##判断时间点是否符合要求
	          raise NameError('the max time point is larger than the video duration....')
	      try:
	          os.mkdir(pathOut)
	      except OSError:
	          pass
	      success = True
	      count = 0
	      while success and count < len(extract_time_points):
	          cap.set(cv2.CAP_PROP_POS_MSEC, (1000 * extract_time_points[count]))
	          success, image = cap.read()
	          if success:
	              if not isColor:
	                  image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  ##转化为黑白图片
	              print('Write a new frame: {}, {}th'.format(success, count + 1))
	              cv2.imwrite(os.path.join(pathOut, "{}_{:06d}.jpg".format(output_prefix, count + 1)), image,
	                          [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])  # save frame as JPEG file
	              count = count + 1
	
	  else:
	      ##判断起始时间、终止时间参数是否符合要求
	      if initial_extract_time > dur:
	          raise NameError('initial extract time is larger than the video duration....')
	      if end_extract_time is not None:
	          if end_extract_time > dur:
	              raise NameError('end extract time is larger than the video duration....')
	          if initial_extract_time > end_extract_time:
	              raise NameError('end extract time is less than the initial extract time....')
	
	      ##时间范围内的每帧图片都输出
	      if extract_time_interval == -1:
	          if initial_extract_time > 0:
	              cap.set(cv2.CAP_PROP_POS_MSEC, (1000 * initial_extract_time))
	          try:
	              os.mkdir(pathOut)
	          except OSError:
	              pass
	          print('Converting a video into frames......')
	          if end_extract_time is not None:
	              N = (end_extract_time - initial_extract_time) * fps + 1
	              success = True
	              count = 0
	              while success and count < N:
	                  success, image = cap.read()
	                  if success:
	                      if not isColor:
	                          image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	                      print('Write a new frame: {}, {}/{}'.format(success, count + 1, n_frames))
	                      cv2.imwrite(os.path.join(pathOut, "{}_{:06d}.jpg".format(output_prefix, count + 1)), image,
	                                  [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])  # save frame as JPEG file
	                      count = count + 1
	          else:
	              success = True
	              count = 0
	              while success:
	                  success, image = cap.read()
	                  if success:
	                      if not isColor:
	                          image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	                      print('Write a new frame: {}, {}/{}'.format(success, count + 1, n_frames))
	                      cv2.imwrite(os.path.join(pathOut, "{}_{:06d}.jpg".format(output_prefix, count + 1)), image,
	                                  [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])  # save frame as JPEG file
	                      count = count + 1
	
	      ##判断提取时间间隔设置是否符合要求
	      elif extract_time_interval > 0 and extract_time_interval < 1 / fps:
	          raise NameError('extract_time_interval is less than the frame time interval....')
	      elif extract_time_interval > (n_frames / fps):
	          raise NameError('extract_time_interval is larger than the duration of the video....')
	
	      ##时间范围内每隔一段时间输出一张图片
	      else:
	          try:
	              os.mkdir(pathOut)
	          except OSError:
	              pass
	          print('Converting a video into frames......')
	          if end_extract_time is not None:
	              N = (end_extract_time - initial_extract_time) / extract_time_interval + 1
	              success = True
	              count = 0
	              while success and count < N:
	                  cap.set(cv2.CAP_PROP_POS_MSEC, (1000 * initial_extract_time + count * 1000 * extract_time_interval))
	                  success, image = cap.read()
	                  if success:
	                      if not isColor:
	                          image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	                      print('Write a new frame: {}, {}th'.format(success, count + 1))
	                      cv2.imwrite(os.path.join(pathOut, "{}_{:06d}.jpg".format(output_prefix, count + 1)), image,
	                                  [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])  # save frame as JPEG file
	                      count = count + 1
	          else:
	              success = True
	              count = 0
	              while success:
	                  cap.set(cv2.CAP_PROP_POS_MSEC, (1000 * initial_extract_time + count * 1000 * extract_time_interval))
	                  success, image = cap.read()
	                  if success:
	                      if not isColor:
	                          image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	                      print('Write a new frame: {}, {}th'.format(success, count + 1))
	                      cv2.imwrite(os.path.join(pathOut, "{}_{:06d}.jpg".format(output_prefix, count + 1)), image,
	                                  [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])  # save frame as JPEG file
	                      count = count + 1

pathIn = 'C:/Users/Administrator/Documents/python3.5/video2picture/qingyue.mp4'#需要绝对路径!
pathOut = 'C:/Users/Administrator/Documents/python3.5/video2picture/getpicture3/'#也需要绝对路径!
video2frames(pathIn, pathOut)

主要功能

提取特定时间点图片,比如:提取视频第3秒, 第5秒,第9秒图片
设定提取的起始时刻,比如:从视频的第10秒开始提取
设定提取的终止时刻,比如:100秒后的视频不提取图片
设定每隔多少秒提取一张图片,比如:每隔2秒从视频中提取一张图片

  1. 函数参数
    video2frames()函数的原型为:
    video2frames(pathIn=’’,
    pathOut=’’,
    only_output_video_info = False,
    extract_time_points = None,
    initial_extract_time = 0,
    end_extract_time = None,
    extract_time_interval = -1,
    output_prefix = ‘frame’,
    jpg_quality = 100,
    isColor = True)

各参数的意义:

pathIn:视频的路径,比如:F:\python_tutorials\test.mp4,绝对路径
pathOut:设定提取的图片保存在哪个文件夹下,比如:F:\python_tutorials\frames\。如果该文件夹不存在,函数将自动创建它
only_output_video_info:如果为True,只输出视频信息(长度、帧数和帧率),不提取图片
extract_time_points:提取的时间点,单位为秒,为元组数据,比如,(2, 3, 5)表示只提取视频第2秒, 第3秒,第5秒图片
initial_extract_time:提取的起始时刻,单位为秒,默认为0(即从视频最开始提取)
end_extract_time:提取的终止时刻,单位为秒,默认为None(即视频终点)
extract_time_interval:提取的时间间隔,单位为秒,默认为-1(即输出时间范围内的所有帧)
output_prefix:图片的前缀名,默认为frame,那么图片的名称将为frame_000001.jpg、frame_000002.jpg、frame_000003.jpg…
jpg_quality:设置图片质量,范围为0到100,默认为100(质量最佳)
isColor:如果为False,输出的将是黑白图片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值