python 视频处理,提取视频相关帧,读取Excel
一共这几个模块:
class videoReader 读取视频
class videoFramesExtractor(videoReader):继承了读取视频,主要是用来限制读取视频中的哪些帧,并保存。
read_excel_single(excel_path,event_instance): 处理Excel中的数组,找到事件的帧数范围:
Excel内容是这样的,需要的只是第二列的帧范围,另外第二列中的这些值还有重复的所以需要去除重复:
每一个范围,例如:23450:23461之内的帧要存放在一个文件夹里。
- </pre><pre name="code" class="python"># -*- coding: cp936 -*-
- import cv2.cv as cv
- import os
- import cv2
- import numpy
- import Image
- import xlrd
- class videoReader:
- frame_count=0
- def __init__(self,videoPath):
- self.videoPath=videoPath
- def video_init(self):
- self.capture = cv.CaptureFromFile(self.videoPath)
- self.win_name = "test"
- cv.NamedWindow(self.win_name, cv.CV_WINDOW_AUTOSIZE)
- def read(self):
- self.video_init()
- while 1:
- self.frame_count+=1
- image = cv.QueryFrame(self.capture )
- cv.ShowImage(self.win_name, image)
- print self.frame_count
- c = cv.WaitKey(10)
- if c == 27:
- break
- cv.DestroyWindow(self.win_name)
- class videoFramesExtractor(videoReader):
- save_path='d:/'
- def __init__(self,videoPath,frameSpan,image_prefix):#image_prefix=event_name
- videoReader.__init__(self,videoPath)
- self.frameSpan=frameSpan
- self.image_prefix=image_prefix
- def read(self):
- capture = cv2.VideoCapture(self.videoPath)
- win_name = "test"
- cv.NamedWindow(win_name, cv.CV_WINDOW_AUTOSIZE)
- success,frame = capture.read()
- init_row=0
- while success:
- self.frame_count+=1
- success,frame = capture.read()
- #cv2.imshow(win_name,frame) #显示照片浪费时间
- time_duration=self.frameSpan[init_row][1]-self.frameSpan[init_row][0]+1
- if self.frame_count>=self.frameSpan[init_row][0] and \
- self.frame_count<=self.frameSpan[init_row][1] :
- self.image_save(frame,init_row,time_duration)
- if self.frame_count==self.frameSpan[init_row][1]:
- init_row+=1
- if init_row==len(self.frameSpan):
- cv.DestroyWindow(win_name)
- return 0
- c = cv.WaitKey(10)
- if c == 27:
- break
- cv.DestroyWindow(win_name)
- def image_save(self,frame,init_row,time_duration):
- save_path=self.make_folder(init_row,time_duration)
- #frame=Image.fromarray(frame)
- #frame.resize((300,300))
- #frame.save('%s//%s.jpg' % (save_path,self.frame_count))
- frame=cv2.resize(frame,(300,300))#
- cv2.imwrite( '%s//%s.jpg' % (save_path,self.frame_count), frame)
- def make_folder(self,init_row,time_duration):
- temp= self.image_prefix+'_'+str(init_row)+'_'+str(time_duration)#事件名称_事件顺序_
- new_path = os.path.join(self.save_path,temp)
- if not os.path.isdir(new_path):
- os.makedirs(new_path)
- return new_path
- def read_excel_single(excel_path,event_instance):
- data=[]
- data=xlrd.open_workbook(excel_path)
- #read the first sheets
- table = data.sheets()[0]
- #read the num fo cols
- nrows = table.nrows
- rowmsg=[]#用来存储帧的范围,及事件的类别,描述。
- for i in xrange(nrows):
- start_frame,end_frame=table.row_values(i)[1].split(':')
- rowmsg.append([int(start_frame),int(end_frame),table.row_values(i)[3]])
- rowmsg.sort(lambda x,y:cmp(x[0],y[0]))#按照数字大小排序~
- event_id=[]
- event_id=event_instance
- #print event_id
- event=[]
- for item in xrange(len(rowmsg)):
- if rowmsg[item][2]==event_id:#
- event.append(rowmsg[item])
- if event==[]:
- print ("there is no %s occurs" % event_instance)
- return 0
- #去除重复
- cur_pos=1
- new_rowmsg=[]
- pre_s=event[0][0]
- pre_e=event[0][1]
- cur_s=event[cur_pos][0]
- cur_e=event[cur_pos][1]
- while cur_pos<len(event)-1:
- while not (cur_s>pre_e):
- if cur_s>pre_s:
- cur_s=pre_s
- if cur_e<pre_e:
- cur_e=pre_e
- still_pos=[cur_s,cur_e,event_id]
- cur_pos+=1
- if cur_pos==len(event)-1:
- break
- pre_s=cur_s
- pre_e=cur_e
- cur_s=event[cur_pos][0]
- cur_e=event[cur_pos][1]
- new_rowmsg.append(still_pos)
- if cur_pos==len(event)-1:
- break
- cur_pos+=1
- pre_s=cur_s
- pre_e=cur_e
- cur_s=event[cur_pos][0]
- cur_e=event[cur_pos][1]
- return new_rowmsg
- excel_source='E:/08ann/dev_20071101/LGW_20071101_E1_CAM1.mpeg.xlsx'
- event_instance='CellToEar'
- row_msg=read_excel_single(excel_source,event_instance)
- new_row=[ item[0:2] for item in row_msg ]
- filename = "G:/TrecvidData/08/DEV/LGW_20071101_E1_CAM1.mpg"
- videoread=videoFramesExtractor(filename,new_row,'CellToEar')
- videoread.read()
有几点发现:
cv2.的函数输出的数据类型基本都是numpy,而cv.不行。所以尽量在Python中使用cv2.的函数。
通过numpy转换后的图片会在颜色上有些失真,不过影响不大,如果是灰度图的话则完全没有影响。
python 视频处理,提取视频相关帧,读取Excel的更多相关文章
- Python调用zabbix API批量添加主机 (读取Excel)
本文转载自:http://blog.mreald.com/178 Zabbix可以通过自发现添加主机,不过有时候不准确,通过API添加会更加准确! 脚本使用的跟zabbix相关的内容.参考的是zabb ...
- 【原创】selenium+python+openpyxl实现登录自动化测试,自动读取excel用例数据,并将数据结果自动写入到excel
# -*- coding: utf-8 -*- from selenium import webdriver from openpyxl import load_workbook from time ...
- spring boot 使用 POI 读取Excel文件
内容简介 本文主要介绍使用POI进行Excel文件的相关操作,涉及读取文件,获取sheet表格,对单元格内容进行读写操作,以及合并单元格的操作. Excel文件目录 Excel模板文件存了resour ...
- python调用mediainfo工具批量提取视频信息
写了2个脚本,分别是v1版本和v2版本 都是python调用mediainfo工具提取视频元数据信息 v1版本是使用pycharm中测试运行的,指定了视频路径 v2版本是最终交付给运营运行的,会把v2 ...
- ffmpeg-python 任意提取视频帧
▶ 环境准备 1.安装 FFmpeg 音/视频工具 FFmpeg 简易安装文档 2.安装 ffmpeg-python pip3 install ffmpeg-python 3.[可选]安装 openc ...
- 【爬虫问题】爬取tv.sohu.com的页面, 提取视频相关信息
尝试解决下面的问题 问题: 爬取tv.sohu.com的页面, 提取视频相关信息,不可用爬虫框架完成 何为视频i关信息?属性有哪些? 需求: 做到最大可能的页面覆盖率 *使用httpClient 模拟 ...
- python 从视频中提取图片,并保存在硬盘上
使用python的moviepy库来提取视频中的图片,按照视频每帧一个图片的方式来保存. extract images from video, than save them to disk from ...
- 【matlab】使用VideoReader提取视频的每一帧,不能用aviread函数~
这个问题是matlab版本问题,已经不用aviread函数了~ VideoReader里面没有cdata这个函数! MATLAB不支持avireader了,而且没有cdata这个属性了,详情去官网ht ...
- Python opencv提取视频中的图片
作者:R语言和Python学堂链接:https://www.jianshu.com/p/e3c04d4fb5f3 这个函数就是本文要介绍的video2frames()函数,功能就是从视频中提取图片,名 ...
随机推荐
- 要成为linux网站运维工程师必须要掌握的技能
要成为linux网站运维工程师必须要掌握的技能 2015-07-27 发表 老男孩点评:感谢此文的作者,写的非常到位,值得入门的初学者认真看看 我是一名linux运维工程师,确切的说是网站运维工程师, ...
- 树莓派进阶之路 (035) - 基于linux的zsh安装脚本
基于linux的zsh安装脚本: Ubuntu版本: #!/bin/sh cd #安装zsh sudo apt-get install zsh #查看zsh cat /etc/shells #更改zs ...
- C++ map,set内部数据结构
1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据.它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序.每个元素的值不能直接被改变.[重点]内部结构采用红黑树的平衡二叉 ...
- linux达人养成计划学习笔记(二)—— 文件查找命令
一.locate命令 1.命令格式: locate 文件名 2.locate在后台数据库中按文件名搜索,速度快,locate命令所搜索的后台数据库 /var/lib/mlocate 3.后台数据库跟新 ...
- 替代crontab,任务计划统一集中管理系统cronsun简介
一.背景 crontab 是 Linux 系统里面最简单易用的定时任务管理工具,相信绝大多数开发和运维都用到过.在咱们公司,很多业务系统的定时任务都是通过 crontab 来定义的,时间长了后会发现存 ...
- Android SDK Manager详解
Android基础知识——Android SDK Manager详解 做Android开发时,免不了使用Android SDK Manager,安装需要的sdk版本.buildTools版本等等. ...
- mysql性能测试(索引)
首先,使用Talend随机生成一千万条数据: 数据库表中现在有1千万+的数据: mysql> select count(*) from zhangchao; +----------+ | cou ...
- KMP算法理解
1.KMP算法解决问题:对BF(Brute Force)算法优化,避免对主串进行回溯匹配(匹配不成功主串指针向后移1位,子串指针重置开始位置,两串继续匹配),效率底. 2.KMP算法原则/目的:主串不 ...
- MYSQL拒绝访问:not allowed to connect解决方法
分享下MYSQL拒绝访问报错not allowed to connect的解决方法. 可以在其它任何的主机上以root身份登录 mysql报如下错误,截取部分, message from server ...
- Atitit js canvas的图像处理类库attilax总结与事业
Atitit js canvas的图像处理类库attilax总结与事业 1.1. 脸部识别JavaScript类库Tracking.js1 1.2. AlloyImage特性1 1.3. CamanJ ...