一共这几个模块:

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. Fedora下使用minicom及USB串口线

    一.minicom Fedora不像以前的RedHat,不能直接输入minicom回车,因为在目录/dev/下面没有modem这个子目录,而minicom的运行默认是有这个目录的,所以直接敲是不行的. ...

  2. 16条Android开发小经验

    1. TextView中的getTextSize返回值是以像素(px)为单位的, 而setTextSize()是以sp为单位的. 所以如果直接用返回的值来设置会出错,解决办法是 用setTextSiz ...

  3. 【Oracle】详解Oracle中NLS_LANG变量的使用

    目录结构: contents structure [+] 关于NLS_LANG参数 NSL_LANG常用的值 在MS-DOS模式和Batch模式中设置NLS_LANG 注册表中NLS_LANG和系统环 ...

  4. MVC摘记

    2013年9月23日18:04:06 直接cshtml页面的js中使用     var customerId = @(ViewBag.Oppotunity as OppotunityDto==null ...

  5. EasyUI DataGrid Checkbox 多选 获取选中行中的内容

    <table id='grid' class='easyui-datagrid' style='width:950px;height:405px' url='Ajax-index.php?mod ...

  6. Oracle 12C -- clone a remote pdb

    Connect to the remote CDB and prepare the remote PDB for cloning. SQL> select con_id,dbid,name,op ...

  7. Android Viewpager加Fragment做界面切换时数据消失的解决方式

    今天遇到多个Fragment切换,回来后页面空白的情况,找到这个博客方法设置了一下,就可以了 vpAdapter = new VpAdapter(getSupportFragmentManager() ...

  8. Linux 性能測试工具

    Linux 性能測试工具 linux performance 查看系统配置 查看CPU信息 lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64- ...

  9. PMD-Java 代码检查工具对 error 和 warning 的配置

    PMD是一款优秀的Java程序代码检查工具.该它可以检查Java代码中是否含有未使用的变量.是否含有空的抓取块.是否含有不必要的对象等. 但在使用过程中,你会项目中发现存在大量的 PMD 插件报出的 ...

  10. php-fpm进程关闭与重启脚本详解

    先来理解一下什么是php-fpm PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的. PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中.必须将 ...