Python+Opencv解析一段视频并逐帧保存到本地

实现原理

使用Python+Opencv,把视频流直接按帧率解析成图片,并保存到本地

特点

可以做到无视视频的长短,视频的帧率。多长就解析多长,多少帧率就解析多少帧率,视频解析完直接退出,避免影响内存或者Opencv窗口卡死

实现的效果

针对一个本地视频:

①时长:从1.02-4.22,共计3.21s

②图片:每秒60张,视频解析出来共计3*60+21=201张图片,如下:

脚本

# -*- coding: cp936 -*-

"""
Author:NoamaNelson
Date:2019-11-15
Discription:Reading video swtich to picture and save 
"""

import cv2,os,time
import numpy as np

class CamaroCap(object):

    """ 打开视频流 """
    def __init__(self):

        self.cap = cv2.VideoCapture("./MVI_1637.MOV")  # 视频路径,直接把脚本和视频放在同一个目录下最好,也可以指定对应的视频路径

    """ 图片信息打印 """      
    def get_image_info(self,image):
        print(type(image))
        print(image.shape)
        print(image.size)
        print(image.dtype)
        pixel_data = np.array(image)
        print(pixel_data)

    """ 逐帧读取数据并保存图片到本地制定位置 """
    def Camaro_image(self):
        i = 0
        while(True):
            ret,frame = self.cap.read() #ret:True或者False,代表有没有读取到图片;frame:表示截取到一帧的图片
            if ret == False:
                break
            
            self.get_image_info(frame) # print("打印图片信息") 注意:调试的时候可以打开,如果是一直运行程序,建议把这行代码注释掉,避免影响内存占用          
            
            cv2.imshow('capture',frame) # 展示图片
            
            cv2.imwrite(r"D:\image\\"+ str(i) + ".jpg",frame)  # 保存图片
            i = i + 1

            if cv2.waitKey(1) & 0xFF == ord('q'): 
                break  

if __name__ == '__main__':

    outmasages = CamaroCap() 
    
    outmasages.Camaro_image() # 调用摄像头
    
    outmasages.cap.release() # 释放对象和销毁窗口
    cv2.destroyAllWindows()
    
本文转载于网络 如有侵权请联系删除

相关文章

  • IDM无法下载.ts文件解决方案

    大家好,又见面了,我是你们的朋友全栈君。IDM无法下载.ts文件解决方案无法下载TS文件问题实例解决方案1.利用IDM获取下载链接2.利用.ts下载软件下载文件【N_m3u8DL-CLI_TS】软件下载软件使用方法下载.ts文件下载完成IDM下载链接无法下载TS文件问题实例点击下载后显示”由于法律原因,IDM无法下载此受保护数据......“ 解决方案1.利用IDM获取下载链接<1>点击IDM浮标,选择想要下载的文件 <2>复制IDM弹窗中的下载链接2.利用.ts下载软件下载文件【N_m3u8DL-CLI_TS】软件下载 下载链接:https://590m.com/d/20422282-43434627-717221(访问密码:8F7j)软件使用方法 <1>解压文件<2>打开文件夹运行软件 在文件夹中找到N_m3u8DL-CLI_v2.9.7.exe,并点击右键以管理员身份运行 下载.ts文件 如图,将下载链接粘贴在运行界面上,并点击Enter键,开始下载 下载完成 在文件夹中找到Downloads文件夹,并打开便会发现对应MP4视频(注

  • Mysql配置文件 innodb引擎(上)

    nnodb参数innodb_buffer_pool_size这个是Innodb最重要的参数,主要作用是缓存innodb表的索引,数据,插入数据时的缓冲,默认值为128M。如果是一个专用innodb引擎的服务器,那么它可以占到内存的70%-80%。并不是设置的越大越好。设置的过大,会导致system的swap空间被占用,导致操作系统变慢,从而减低sql查询的效率。如果你的数据比较小,那么可分配是你的数据大小+10%左右做为这个参数的值。例如:数据大小为50M,那么给这个值分配innodb_buffer_pool_size=64M就够了查询: 在线配置: 配置文件:innodb_buffer_pool_size=16Ginnodb_read_io_threads|innodb_write_io_threads在MySQL5.1.X版本中,innodb_file_io_threads参数默认是4,该参数在Linux系统上是不可更改的,但Windows系统上可以调整。这个参数的作用是:InnoDB使用后台线程处理数据页上读写I/O(输入输出)请求的数量。在MySQL5.5.X版本中,或者说是在

  • 别用Excel做数据可视化了!这款报表工具不比它香100倍?

    昨天朋友聚餐,做报表的张哥在饭桌上吐槽,说现在的报表工程师太难了,不仅要会敲代码,还要会做视觉设计。我们感到很纳闷,为什么?他说没想到公司里上司和同事们都是“颜控”,对报表也有颜值要求。他和新来的小王都是做报表的,不过小王做出来的报表比较好看,经常被领导同事表扬。而他做的报表太过朴素,所以同事们都抢着跟小王提需求,他觉得很郁闷。张哥不是没想过改进,他还专门在网上学了Excel做数据可视化的教程,不过跟着做出来的报表效果都不尽如人意,少数还算好看的却需要耗费大量的时间精力,实在是没必要。我冲老张说,哥,如果你们家要装修,你会去找一个学水彩画的人帮你粉刷嘛?张哥摇了摇头。我说,对呀,你是知道的,专业的事要让专业的人来做,那专业的功能也要用专业的工具做对不?Excel做表格是个顶呱呱的帮手,不过做图表那就不行了,样式老旧、不丰富,制作过程还很繁琐,实在不是做图表的料。而要想做出一份好看的报表,一套专业的报表工具是必不可少的。张哥若有所思地点了点头。我接着说,市面上有不少做报表的工具,但真正同时把可视化效果和易用性都做到极致的,毫无疑问,当属市场占有率第一的FineReport,这是一款专业的

  • python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

    Rosenbrock函数的定义如下:其函数图像如下:我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验。梯度下降梯度下降的更新公式:图中蓝色的点为起点,橙色的曲线(实际上是折线)是寻找最小值点的轨迹,终点(最小值点)为(1,1)(1,1)。梯度下降用了约5000次才找到最小值点。我选择的迭代步长α=0.002α=0.002,αα没有办法取的太大,当为0.003时就会发生振荡:牛顿法牛顿法的更新公式:Hessian矩阵中的每一个二阶偏导我是用手算算出来的。牛顿法只迭代了约5次就找到了函数的最小值点。下面贴出两个实验的代码。梯度下降:importnumpyasnp importmatplotlib.pyplotasplt frommatplotlibimportticker deff(x,y): return(1-x)**2+100*(y-x*x)**2 defH(x,y): returnnp.matrix([[1200*x*x-400*y+2,-400*x], [-400*x,200]]) defgrad(x,y): returnnp.matrix([[2*x

  • 用遗传算法求函数最大值二:选择、交叉和变异

    选择选择(或复制)操作决定哪些个体可以进入下一代。这里采用轮盘赌法选择,这种方法比较容易实现。在轮盘赌法中,设种群大小为n,其中个体i的适应值是f_ifi,则i被选择的概率为:p_i=\frac{f_i}{\sum_{j=1}^{n}f_i}pi=∑j=1nfifi显然,个体适应值越大,被选择的概率越大。轮盘赌法具体步骤如下:计算f_{sum}fsum和p_ipi。产生(0,1)的随机数rand,求s=rand×f_sum。求\sum_{i=1}^kf_i\geqslants∑i=1kfi⩾s中最小的k,该k被选中。多次操作,直到得到指定个个体。代码实现如下:function[newpop]=selection(pop,fitvalue)%选择,轮盘赌方法,最大化问题%popinput种群%fitvalueinput适应度值%newpopoutput选择后的种群totalfit=sum(fitvalue);fitvalue=fitvalue/totalfit;fitvalue=cumsum(fitvalue);[n,l]=size(pop);newpop=zeros(n,l);rnum

  • 如何避免云计算的成本超支

    优化云计算成本是2018年调查中受访者的首要举措,其中58%的受访者将其列为首要的云计算优先级。尽管如此,研究发现只有少数受访者已经实施了自动化策略来优化云计算成本,例如关闭未使用的工作负载或选择成本较低的云平台或云区域。在云计算革命开始之初,组织只需为其所使用的内容付费,就可以更高效地节省IT支出。虽然对某些组织来说确实是这种情况,并且促进了网络规模企业快速增长,但总是存在云计算成本膨胀的风险,即企业采用不同供应商越来越多的服务,无法对其云计算支出进行有效的追踪和控制。 企业将其转移到公共云可能不一定会使其节约更多的成本,但却可能改变其组织采购和支付的方式,使其成本比原有的长期许可模式更加难以预测。例如,音乐流媒体提供商Spotify公司最近完成了其业务从内部数据中心向谷歌云平台(GCP)的完全迁移。在2018年7月的GoogleCloudNext会议期间,当被问及这一举措的成本影响时,Spotify公司工程总监RamonvanAlteren说:“当我们从一个集中购买位置转移到分布式的购买位置时,这是一个关键的事情。分散的购买位置加强了客户的消费能力,这要看情况而定。目前我们的规模已

  • 从XML文件乱码问题,探寻其背后的原理

    出现应用程序读取XML文件乱码的场景:加入xml文件以<?xmlversion="1.0"encoding="utf-8"?>格式的;如果对xml文件进行修改了,其中包含中文字符的内容,另存为其他格式化时(比如unicod,ANSI)等等格式,则新保存的配置文件,程序读取时候将会出现乱码,不能正常的读取。验证如下方法:(1)、可以将XML文件拖放在IE浏览器上,会出现XML文件无法正常的在浏览器上面渲染。(2)、通过Visualstudio打开该XML文件,会出现加载格式错误!参看地址:http://blog.csdn.net/dinglang_2009/article/details/6895355在日常开发工作中,我们经常会使用到XML,早已成为了一种标准。它的用途非常的广泛,但这些不是本文所重点讨论的。相信大家在做开始时候经常碰到过“乱码”的问题,这是中国程序员非常头疼的问题。我一直很想深入研究关于“编码”的原理,无奈水平有限,那些枯燥的理论(二进制,ASCII,Unicode,UTF-8,gb2312,ISO...光这些就让我

  • 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分

    最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理。情景再现:当我手机铃声响起,看着屏幕上面显示的归属地是来自陕西西安的电话,我知道属于我人生的第一次电话面试要来了。接起电话后,电脑那头传来了面试官的声音(中间省略了一些客套,直接上面试题。)面试官发问,“谈谈你对Vue数据双向绑定的认识”。面试官的这个问题也可以理解成为“你是怎么理解Vue数据绑定,知道它背后实现的原理么”。一般刚毕业的前端新人可能会说,用v-model。(当然,这可能是句废话)如果简单说下v-model指令,是Vue的语法糖之类的,可能不会让面试官满意,也看不出你对Vue的熟练程度。只能说明你看过Vue的官方文档,如下图所示:如果你的回答点到此为止,基本上是不合格的。此时面试官可能会含蓄地追问:然后呢?其实,如果面试官就这个问题追问,你应该要往两方面想。往浅了说,如果不用v-model指令,你能用自己的思路实现双向绑定吗?往深了挖,他是想问v-model实现背后的原理。如果你能get到这一点,说明你

  • 量子生命|生物信息是如何编码的, 又是如何遗传的?

    我们总是把生物精确复制自身基因组的能力视为理所当然的,但这项能力却是生命最非凡、最根本的特质。DNA复制的错误率,也就是我们所说的变异,通常小于1/109。为了让我们对这个高到令人震惊的精确度有些概念,我们可以想象一下本书中所包含的约几十万字、标点符号和空格,现在,假设图书馆中有约1000本篇幅相近的书,你的任务是如实地抄写这些书中的每一个字、标点和空格。你觉得你会犯多少错误?这正是在印刷机发明之前,中世纪的抄写员们所做的工作。他们必须尽最大努力用手抄写文本。他们抄写的文本满是错误,这其实并不奇怪,我们从中世纪那些充满分歧的不同手抄本中可见一斑。当然,计算机能以非常高的准确度复制信息,但计算机完成任务靠的是基于固体硬件的现代电子数码技术。假设用“湿软黏糊的材料”制成一台复印机,你觉得如果用这台机器来读取和书写要复制的内容会犯多少错误呢?不过,如果“湿软黏糊的材料”是你体内的一个细胞,要复制的信息以DNA的形式编码,那么错误的数量就会少于一个字,也就是1/109。 高精度的复制对生命至关重要,因为活体组织高度的复杂性要求指令的设置必须同样复杂,每一个错误都有可能是致命的。我们细胞内的基因

  • 1-LPC1778建立工程

    先来建立一个工程模板,,,要比32简单的多,假设32是用库开发的话,,,,因为还要把那些和库相关的文件加到工程里....LPC呢就只需要把设置系统和总线的时钟文件(system_LPC177x_8x);堆栈初始化,中断向量和中断函数定义的启动文件(startup_LPC177x_8x);内存操作,用结构体封装起来的文件(LPC177x_8x.h),这样的话修改结构体里面的成员变量的值就是操作对应寄存器的值了,如果不用结构体封装,寄存器那么多,天哪!,那要定义多少变量.....和ARM公司提供的进入M3内核接口的文件(core_cm3)加到工程里就完啦!对了STM32F103的和LPC1778用的都是Cortex-M3内核所以呢内核文件(core_cm3)是一样的.....就新建个文件夹然后..忘啦还要加一个好现在就去找一找这四种文件这里面找了一下竟然没找到core_cm3.c,虽然有core_cm3.h但是还是别用这个了,不知道是不是被我删除了,,,算啦不在这里面找啦,我就直接把STM32库里面的复制粘贴过来吧现在新建一个主函数文件,然后保存现在设置下那些乱七八糟文件的输出路径 现在编

  • React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)

    本教程总共7篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章!1.React多页面应用1(webpack开发环境搭建,包括Babel、热更新等)----2017.12.282.React多页面应用2(处理CSS及图片,引入postCSS及图片处理等)----2017.12.293.React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)----2017.12.304.React多页面应用4(webpack自动化生成多入口页面)----2017.12.315.React多页面应用5(webpack生产环境配置,包括压缩js代码,图片转码等)----2018.01.016.React多页面应用6(gulp自动化发布到多个环境,生成版本号,打包成zip等)----2018.01.027.React多页面应用7(引入eslint代码检查)----2018.01.03开发环境:Windows8,nodev8.9.1,npm5.5.1,WebStorm2017.2.2当我们项目页面越来越多,依赖越来越多,打包时间会越来越长,那么我们如优化呢?

  • Debian JDK安装及配置

    DebianOracleJDK开发环境配置设置编码nano/etc/default/locale LANG="en_US.UTF-8" LANGUAGE="en_US:en"复制如果不支持en_US.UTF-8,需要手动运行dpkg-reconfigurelocales选择相应的编码,安装完成之后重启即可。x86_64架构的Debian兼容i386的软件系统sudodpkg--add-architecturei386 sudoapt-getupdate sudoapt-getinstalllibc6:i386libncurses5:i386libstdc++6:i386zlib1g:i386复制如果想卸载i386架构,可以通过如下命令:sudoapt-getremove--purge`dpkg--get-selections|grepi386|awk'{print$1}'` sudodpkg--remove-architecturei386复制安装OracleJDK9去官网下载OracleJDK,一定下载tar.gz的压缩文件

  • php案例:判断IP地址是否合法+IP地址范围区间

    作者:陈业贵华为云享专家51cto(专家博主明日之星TOP红人)阿里云专家博主 文章目录cyg.phpcyg.php<?php //IP地址的范围:1.0.0.1-----255.255.255.255 $ip="127.0.0.1"; $arr=explode('.',$ip);//以.为区间分开(把字符串变成数组) //var_dump($arr);//效果·:array(4){[0]=>string(3)"127"[1]=>string(1)"0"[2]=>string(1)"0"[3]=>string(1)"1" if(count($arr)!=4){//如果这个数组的下标不是4个 echo"这个IP是不合法的"; exit();//退出程序 }else{//否则 遍历数组中每一个下标 for($i=0;$i<4;$i++){ if(($arr[$i]<'0'

  • Kubernetes进阶实战读书笔记:配置容器应用(容器化应用配置方式)

     一、容器化应用配置方式 每个应用程序都是一个可执行程序文件、它包含操作码列表、CPU通过执行这些操作码来完成特定的操作、例如,cat命令是由:/usr/bin/cat文件提供的、该文件含有机器指令的列表、在屏幕上显示制定文件的内容时需要使用这些机器指令、几乎每个程序的行为都可以通过其命令选项及参数或配置文件来按需定制、实践中、人们通常不会以默认的配置参数运行应用程序、而是需要根据特定的环境或具体的需求定制起运行特性、对于复杂的服务类应用程序更是如此,如NGINX、tomacat和HBase等、而且通过配置文件定义其配置通常首选甚至是唯一的途径 为nginx配置一个特定的SERVER或指定worker进程的数量、为tomcat的JVM配置起队内存的大小等 1、通过命令行参数进行配置 dockerfile中的ENTRPOINT和CMD、同时使用CMD指令列表的所有元素均被视作是由ENTRPOINT制定的程序的命令行参数在基于某镜像使用docker命令创建容器时、可以在冥想行向ENTRPOINT中的程序传递额外的自定义参数、甚至还可以修改要运行的应用程序本身在kubernetes

  • CMake语法—函数(解析参数)

    目录CMake语法—函数(解析参数)1CMake函数解析参数示例1.1CMakeLists.txt1.2执行CMake配置脚本1.3目录结构2运行结果2.1环境说明2.2运行结果2.3结论2.3.1cmake_parse_arguments命令定义2.3.2prefix:参数前缀2.3.3options:选项2.3.4one_value_keywords2.3.5multi_value_keywords2.3.6args:一般传入${AGRN}即可2.3.7调用函数时,实参没有顺序要求2.3.8prefix_KEYWORDS_MISSING_VALUES:定义关键词,但没有对应的值2.3.9prefix_UNPARSED_ARGUMENTS:表示未被使用的实参值2.3.10多值关键词,对应的值也可以为单数2.3.11通过foreach可以打印多值关键词的每个值 CMake语法—函数(解析参数) 1CMake函数解析参数示例 1.1CMakeLists.txt cmake_minimum_required(VERSION3.18) #设置工程名称 set(PROJECT_NAMEKAI

  • docker部署Postgresql9.2

    这里环境为centos7 1,安装docker 卸载旧版本 1yumremovedocker\ 2docker-client\ 3docker-client-latest\ 4docker-common\ 5docker-latest\ 6docker-latest-logrotate\ 7docker-logrotate\ 8docker-engine复制 使用docker阿里云仓库安装 1yum-config-manager\ 2--add-repo\ 3http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo复制 安装DockerEngine-Community yuminstalldocker-cedocker-ce-clicontainerd.io复制 启动docker systemctlstartdocker复制 通过运行hello-world映像来验证是否正确安装了DockerEngine-Community  dockerrunhello-world复制 2,安装pg9.

  • 关于为vue的图片添加前缀地址

    今天在做项目的分页功能时,遇到了一个问题。在项目中,我抽离了微博组件,并利用props,使其只需要传入一个微博数组便可将其转换成微博列表展示出来。对于其中的图片,我先前采用对数组for循环添加前缀,来使其找到对应的路径。 但是,当我使用分页时,因我在第一页已对数组中的图片添加了地址,当我加载第二页时,又对其第一页的图片添加了地址,于是图片地址便产生了错误。 在思考了一段时间后,我便尝试把img标签的:src从原先的微博.图片名修改成地址/微博.图片名,试了试,完美。 原代码 <div v-for="weiboofweiboList" ... > ... <imgalt="头像"title="头像":src="weibo.userHead"/> ... </div>复制 现代码 <div v-for="weiboofweiboList" ... > ... <imgalt="头像"title="头像":src="`${publicPath}img/${weibo.userHead}`"/> ... </div>

  • swift 动态获取label宽度或高度

    funcgetLabHeigh(labelStr:String,font:UIFont,width:CGFloat)->CGFloat{     letstatusLabelText:NSString=labelStr     letsize=CGSizeMake(width,900)     letdic=NSDictionary(object:font,forKey:NSFontAttributeName)     letstrSize=statusLabelText.boundingRectWithSize(size,options:.UsesLineFragmentOrigin,attributes:dicas?[String:AnyObject],context:nil).size     returnstrSize.height   }  &

  • oracle如何将数据导入到另一个表空间

    某个用户的数据在USER表空间里,如果多个用户的数据都在USERS表空间内,将严重影响系统性能,一般在系统迁移的时候,在新的系统里希望导入一个独立的用户表空间,但是经常无法导入用户指定的缺省表空间,这个问题产生的原因是如果一个用户有DBA的权限,导入数据的时候,就会写回原表空间users解决问题的方法,创建用户的时候不要赋予DBA的权限CREATEUSER"GX" PROFILE"DEFAULT"   IDENTIFIEDBY"gx"DEFAULTTABLESPACE"GX"   TEMPORARYTABLESPACE"TEMP"   ACCOUNTUNLOCK;注意只要有connectimp_full_database,resoure就能导入用户的数据,不要赋予DBA权限GRANT"CONNECT"TO"GX";GRANT"IMP_FULL_DATABASE"TO"GX";GRANT"RESOURCE"TO"GX";回收用户无限制的权限;revokeunlimitedtablespac

  • 「游记」AtCoder Beginner Contest 209

    才4题(E题不知道错哪了),不过涨了500+Rating灰名->褐名 A-Counting sbt B-Canyoubuythemall? sbt C-NotEqual 排个序然后sbt D-Collision 很显然就是问两点之间距离的奇偶性,打了个树剖求lca就过了 自此花费了17分55秒 E-Shiritori 赛时我是利用map把字符串对应一个整数,再用vector存字符串对应的点之间的边,跑了个记搜。不知道为什么一直错5个点。。。一直到比赛结束(甚至到现在)都没有找出问题所在。 题解类似广搜的想法,已经在队列里的不再重复加入。其他地方貌似跟我一样。所以我到底错哪了QwQ F-Deforestation 赛时被E题弄的没有时间了。。。考虑每个高度\(H_i\)对答案的贡献,想到\(O(n^3)\)的DP。 前缀和优化一下\(O(n^2)\)。

  • Mysql(五) JDBC

    一、JDBC   JDBC(JavaDataBaseConnectivity)是Java数据库连接API。  JDBC完成三件事: 与一个数据库连接     向数据库发送SQL语句        处理数据库返回的结果    Java.sql包提供了JDBCAPI,声明了访问数据库的接口和类, 可以通过它编写访问数据库的程序。    JDBCAPI只是定义了相关的规范(提供相应的接口),并不 能直接访问数据库,它依赖于数据库厂商提供具体的实现。       1、相关实现         2、Java.sql包中的接口和类:     Driver接

相关推荐

推荐阅读