一共这几个模块:

class videoReader 读取视频

class videoFramesExtractor(videoReader):继承了读取视频,主要是用来限制读取视频中的哪些帧,并保存。

read_excel_single(excel_path,event_instance): 处理Excel中的数组,找到事件的帧数范围:

Excel内容是这样的,需要的只是第二列的帧范围,另外第二列中的这些值还有重复的所以需要去除重复:

每一个范围,例如:23450:23461之内的帧要存放在一个文件夹里。

  1. </pre><pre name="code" class="python"># -*- coding: cp936 -*-
  2. import cv2.cv as cv
  3. import os
  4. import cv2
  5. import numpy
  6. import Image
  7. import xlrd
  8. class videoReader:
  9. frame_count=0
  10. def __init__(self,videoPath):
  11. self.videoPath=videoPath
  12. def video_init(self):
  13. self.capture = cv.CaptureFromFile(self.videoPath)
  14. self.win_name = "test"
  15. cv.NamedWindow(self.win_name, cv.CV_WINDOW_AUTOSIZE)
  16. def read(self):
  17. self.video_init()
  18. while 1:
  19. self.frame_count+=1
  20. image = cv.QueryFrame(self.capture )
  21. cv.ShowImage(self.win_name, image)
  22. print self.frame_count
  23. c = cv.WaitKey(10)
  24. if c == 27:
  25. break
  26. cv.DestroyWindow(self.win_name)
  27. class videoFramesExtractor(videoReader):
  28. save_path='d:/'
  29. def __init__(self,videoPath,frameSpan,image_prefix):#image_prefix=event_name
  30. videoReader.__init__(self,videoPath)
  31. self.frameSpan=frameSpan
  32. self.image_prefix=image_prefix
  33. def read(self):
  34. capture = cv2.VideoCapture(self.videoPath)
  35. win_name = "test"
  36. cv.NamedWindow(win_name, cv.CV_WINDOW_AUTOSIZE)
  37. success,frame = capture.read()
  38. init_row=0
  39. while success:
  40. self.frame_count+=1
  41. success,frame = capture.read()
  42. #cv2.imshow(win_name,frame) #显示照片浪费时间
  43. time_duration=self.frameSpan[init_row][1]-self.frameSpan[init_row][0]+1
  44. if self.frame_count>=self.frameSpan[init_row][0] and \
  45. self.frame_count<=self.frameSpan[init_row][1] :
  46. self.image_save(frame,init_row,time_duration)
  47. if self.frame_count==self.frameSpan[init_row][1]:
  48. init_row+=1
  49. if init_row==len(self.frameSpan):
  50. cv.DestroyWindow(win_name)
  51. return 0
  52. c = cv.WaitKey(10)
  53. if c == 27:
  54. break
  55. cv.DestroyWindow(win_name)
  56. def image_save(self,frame,init_row,time_duration):
  57. save_path=self.make_folder(init_row,time_duration)
  58. #frame=Image.fromarray(frame)
  59. #frame.resize((300,300))
  60. #frame.save('%s//%s.jpg' % (save_path,self.frame_count))
  61. frame=cv2.resize(frame,(300,300))#
  62. cv2.imwrite( '%s//%s.jpg' % (save_path,self.frame_count), frame)
  63. def make_folder(self,init_row,time_duration):
  64. temp= self.image_prefix+'_'+str(init_row)+'_'+str(time_duration)#事件名称_事件顺序_
  65. new_path = os.path.join(self.save_path,temp)
  66. if not os.path.isdir(new_path):
  67. os.makedirs(new_path)
  68. return new_path
  69. def read_excel_single(excel_path,event_instance):
  70. data=[]
  71. data=xlrd.open_workbook(excel_path)
  72. #read the first sheets
  73. table = data.sheets()[0]
  74. #read the num fo cols
  75. nrows = table.nrows
  76. rowmsg=[]#用来存储帧的范围,及事件的类别,描述。
  77. for i in xrange(nrows):
  78. start_frame,end_frame=table.row_values(i)[1].split(':')
  79. rowmsg.append([int(start_frame),int(end_frame),table.row_values(i)[3]])
  80. rowmsg.sort(lambda x,y:cmp(x[0],y[0]))#按照数字大小排序~
  81. event_id=[]
  82. event_id=event_instance
  83. #print event_id
  84. event=[]
  85. for item in xrange(len(rowmsg)):
  86. if rowmsg[item][2]==event_id:#
  87. event.append(rowmsg[item])
  88. if event==[]:
  89. print ("there is no %s occurs" % event_instance)
  90. return 0
  91. #去除重复
  92. cur_pos=1
  93. new_rowmsg=[]
  94. pre_s=event[0][0]
  95. pre_e=event[0][1]
  96. cur_s=event[cur_pos][0]
  97. cur_e=event[cur_pos][1]
  98. while cur_pos<len(event)-1:
  99. while not (cur_s>pre_e):
  100. if cur_s>pre_s:
  101. cur_s=pre_s
  102. if cur_e<pre_e:
  103. cur_e=pre_e
  104. still_pos=[cur_s,cur_e,event_id]
  105. cur_pos+=1
  106. if cur_pos==len(event)-1:
  107. break
  108. pre_s=cur_s
  109. pre_e=cur_e
  110. cur_s=event[cur_pos][0]
  111. cur_e=event[cur_pos][1]
  112. new_rowmsg.append(still_pos)
  113. if cur_pos==len(event)-1:
  114. break
  115. cur_pos+=1
  116. pre_s=cur_s
  117. pre_e=cur_e
  118. cur_s=event[cur_pos][0]
  119. cur_e=event[cur_pos][1]
  120. return new_rowmsg
  121. excel_source='E:/08ann/dev_20071101/LGW_20071101_E1_CAM1.mpeg.xlsx'
  122. event_instance='CellToEar'
  123. row_msg=read_excel_single(excel_source,event_instance)
  124. new_row=[ item[0:2] for item in row_msg ]
  125. filename = "G:/TrecvidData/08/DEV/LGW_20071101_E1_CAM1.mpg"
  126. videoread=videoFramesExtractor(filename,new_row,'CellToEar')
  127. videoread.read()

有几点发现:

cv2.的函数输出的数据类型基本都是numpy,而cv.不行。所以尽量在Python中使用cv2.的函数。

通过numpy转换后的图片会在颜色上有些失真,不过影响不大,如果是灰度图的话则完全没有影响。

python 视频处理,提取视频相关帧,读取Excel的更多相关文章

  1. Python调用zabbix API批量添加主机 (读取Excel)

    本文转载自:http://blog.mreald.com/178 Zabbix可以通过自发现添加主机,不过有时候不准确,通过API添加会更加准确! 脚本使用的跟zabbix相关的内容.参考的是zabb ...

  2. 【原创】selenium+python+openpyxl实现登录自动化测试,自动读取excel用例数据,并将数据结果自动写入到excel

    # -*- coding: utf-8 -*- from selenium import webdriver from openpyxl import load_workbook from time ...

  3. spring boot 使用 POI 读取Excel文件

    内容简介 本文主要介绍使用POI进行Excel文件的相关操作,涉及读取文件,获取sheet表格,对单元格内容进行读写操作,以及合并单元格的操作. Excel文件目录 Excel模板文件存了resour ...

  4. python调用mediainfo工具批量提取视频信息

    写了2个脚本,分别是v1版本和v2版本 都是python调用mediainfo工具提取视频元数据信息 v1版本是使用pycharm中测试运行的,指定了视频路径 v2版本是最终交付给运营运行的,会把v2 ...

  5. ffmpeg-python 任意提取视频帧

    ▶ 环境准备 1.安装 FFmpeg 音/视频工具 FFmpeg 简易安装文档 2.安装 ffmpeg-python pip3 install ffmpeg-python 3.[可选]安装 openc ...

  6. 【爬虫问题】爬取tv.sohu.com的页面, 提取视频相关信息

    尝试解决下面的问题 问题: 爬取tv.sohu.com的页面, 提取视频相关信息,不可用爬虫框架完成 何为视频i关信息?属性有哪些? 需求: 做到最大可能的页面覆盖率 *使用httpClient 模拟 ...

  7. python 从视频中提取图片,并保存在硬盘上

    使用python的moviepy库来提取视频中的图片,按照视频每帧一个图片的方式来保存. extract images from video, than save them to disk from ...

  8. 【matlab】使用VideoReader提取视频的每一帧,不能用aviread函数~

    这个问题是matlab版本问题,已经不用aviread函数了~ VideoReader里面没有cdata这个函数! MATLAB不支持avireader了,而且没有cdata这个属性了,详情去官网ht ...

  9. Python opencv提取视频中的图片

    作者:R语言和Python学堂链接:https://www.jianshu.com/p/e3c04d4fb5f3 这个函数就是本文要介绍的video2frames()函数,功能就是从视频中提取图片,名 ...

随机推荐

  1. windbg dds、dps、dqs

    dds.dps和dqs命令显示给定范围内存的内容,它们是把内存区域转储出来,并把内存中每个元素都视为一个符号对其进行解析,dds是四字节视为一个符号,dqs是每8字节视为一个符号,dps是根据当前处理 ...

  2. Windows Server 2008中安装IIS7.0

    最近由于需求重新部署了一台服务器Windows Server 2008,由于以前都是在Windows Server 2003上操作,因此记录下,供其他同学参考.   下面主要介绍在Windows Se ...

  3. Snip for Mac(桌面截图工具)安装

    1.软件简介    Snip 一款用于桌面截图的工具. 2.资源列表 链接 提取密码 系统要求 软件语言 Snip for Mac v2.0 (5771) fgab macOS 10.6.8 及以上 ...

  4. MongoDB 学习笔记(9)--- Limit与Skip方法

    MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的 ...

  5. MongodDB---初识

    NoSQL介绍 一.NoSQL简介 NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ...

  6. git log退出方法

    英文状态下按Q

  7. 【转】对 Parser 的误解

    一直很了解人们对于parser的误解,可是一直都提不起兴趣来阐述对它的观点.然而我觉得是有必要解释一下这个问题的时候了.我感觉得到大部分人对于parser的误解之深,再不澄清一下,恐怕这些谬误就要写进 ...

  8. Fragment使用具体解释

    fragment是Google在3.0版本号中推出的新功能,如今已经增加到V4包中,假设要使用V4兼容包中的Fragment须要将Activity换成FragmentActivity,调用的getSu ...

  9. Objective-C 资源收藏

    日志 https://github.com/robbiehanson/CocoaLumberjack 反汇编 otool      nm http://stackoverflow.com/questi ...

  10. 如何在"Visual Studio Code"中使用" Git" 进行版本控制

    如何在"Visual Studio Code"中使用" Git" 进行版本控制 本来认为此类教程,肯定是满网飞了.今天首次使用VS Code的Git功能,翻遍了 ...