处理视频,最常用的开源工具箱非opencv莫属了,python可以很好的支持它。

一 从视频读取帧、得到相关属性、并设置保存哪些帧

首先;我们得新建一个videocapture对象;

cap=cv2.VideoCapture(videopath)

通过上面建立的对象,可以获取视频的相关属性,一般使用中用到的属性主要有如下:

cv2.CAP_PROP_FRAME_WIDTH 视频的宽度。

cv2.CAP_PROP_FRAME_HEIGHT 视频的高度。

cv2.CAP_PROP_FPS 视频的帧率
通过函数:

cap.get(pID) # cap.get(cv2.CAP_PROP_FPS) 

当从视频中读取帧的时候,我们可以设置时间或者帧序数读取指定的帧,通过set函数可以实现:

set(cv2.CAP_PROP_POS_MSEC,time)  #time为设置的时间,以毫秒计(1s = 1000ms)set(cv2.CAP_PROP_POS_FRAMES,frame)  #frame为帧序数

下面一个实例来展现完整的用法:

cap = cv2.VideoCapture('test.avi') #创建一个视频获取对象
flag = 0  #用于指定帧的序号
fr=1
time=0    #用于指定帧的时长
while (cap.isOpened()):cap.set(cv2.CAP_PROP_POS_MSEC,time)#cap.set(cv2.CAP_PROP_POS_FRAMES,flag) #设置帧数标记ret,im = cap.read()#获取图像if not ret:  #如果获取失败,则结束print("exit")break#cv2.waitKey(2000)#延时#cv2.imshow('a',im)#显示图像,用在循环中可以播放视频cv2.imwrite('output/{0:05d}.jpg'.format(fr),im)#保存图片time+=50  #设置每隔50ms读取帧#flag+=10  #每隔10帧读取一帧fr+=1

二 、通过连续的帧提取TVL1光流

安装依赖包:

pip3 install opencv-python==4.1.2.30

pip3 install opencv-contrib-python==4.1.2.30

def cal_for_frames(video_path):frames = glob(os.path.join(video_path, '*.jpg'))frames.sort()flow = []prev = cv2.imread(frames[0])prev = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)for i, frame_curr in enumerate(frames[1:]):curr = cv2.imread(frame_curr)curr = cv2.cvtColor(curr, cv2.COLOR_BGR2GRAY)tmp_flow = compute_TVL1(prev, curr)flow.append(tmp_flow)prev = currreturn flowdef compute_TVL1(prev, curr, bound=15):"""Compute the TV-L1 optical flow."""TVL1=cv2.optflow.DualTVL1OpticalFlow_create()# TVL1 = cv2.DualTVL1OpticalFlow_create()# TVL1=cv2.createOptFlow_DualTVL1()flow = TVL1.calc(prev, curr, None)assert flow.dtype == np.float32flow = (flow + bound) * (255.0 / (2 * bound))flow = np.round(flow).astype(int)flow[flow >= 255] = 255flow[flow <= 0] = 0return flowdef save_flow(video_flows, flow_path):if not os.path.exists(os.path.join(flow_path, 'u')):os.mkdir(os.path.join(flow_path, 'u'))if not os.path.exists(os.path.join(flow_path, 'v')):os.mkdir(os.path.join(flow_path, 'v'))for i, flow in enumerate(video_flows):cv2.imwrite(os.path.join(flow_path,'u', "{:06d}.jpg".format(i)),flow[:, :, 0])cv2.imwrite(os.path.join(flow_path,'v', "{:06d}.jpg".format(i)),flow[:, :, 1])def extract_flow(video_path, flow_path):flow = cal_for_frames(video_path)save_flow(flow, flow_path)print('complete:' + flow_path)returnif __name__ == '__main__':video_path=path_to_video  #预先提取好的视频帧save_path=path_to_save    #保存光流的路径extract_flow(video_path,save_path)

---------------------------------------------------------------------------------------------------------------

import cv2 cap = cv2.VideoCapture(file_path.encode('utf-8')) # file_path是文件的绝对路径,防止路径中含有中文时报错,需要解码
if cap.isOpened(): # 当成功打开视频时cap.isOpened()返回True,否则返回False # get方法参数按顺序对应下表(从0开始编号) rate = cap.get(5) # 帧速率FrameNumber = cap.get(7) # 视频文件的帧数duration = FrameNumber/rate/60 # 帧速率/视频总帧数 是时间,除以60之后单位是分钟

另外,cv2.VideoCapture(0)是打开本地摄像头

以下是opencv-python可以获取视频的相关信息,可以通过从0开始的序号获取

CAP_PROP_POS_MSEC 视频文件的当前位置(以毫秒为单位)或视频捕获时间戳。
CAP_PROP_POS_FRAMES 接下来要解码/捕获的帧的基于0的索引。
CAP_PROP_POS_AVI_RATIO 视频文件的相对位置:0 - 电影的开始,1 - 电影的结尾。
CAP_PROP_FRAME_WIDTH 视频流中帧的宽度。
CAP_PROP_FRAME_HEIGHT 视频流中帧的高度。
CAP_PROP_FPS 帧速率。
CAP_PROP_FOURCC 编解码器的4字符代码。

CAP_PROP_FRAME_COUNT 视频文件中的帧数。
CAP_PROP_FORMAT 返回的Mat对象的格式 retrieve() 。

CAP_PROP_MODE 指示当前捕获模式的特定于后端的值。
CAP_PROP_BRIGHTNESS 图像的亮度(仅适用于相机)。
CAP_PROP_CONTRAST 图像对比度(仅适用于相机)。
CAP_PROP_SATURATION 图像的饱和度(仅适用于相机)。
CAP_PROP_HUE 图像的色调(仅适用于相机)。
CAP_PROP_GAIN 图像的增益(仅适用于相机)。
CAP_PROP_EXPOSURE 曝光(仅适用于相机)。
CAP_PROP_CONVERT_RGB 布尔标志,指示是否应将图像转换为RGB。
CAP_PROP_WHITE_BALANCE_U 白平衡设置的U值(注意:目前仅支持DC1394 v 2.x后端)
CAP_PROP_WHITE_BALANCE_V 白平衡设置的V值(注意:目前仅支持DC1394 v 2.x后端)
CAP_PROP_RECTIFICATION 立体摄像机的整流标志(注意:目前仅支持DC1394 v 2.x后端)
CAP_PROP_ISO_SPEED摄像机 的ISO速度(注意:目前仅支持DC1394 v 2.x后端)
CAP_PROP_BUFFERSIZE 存储在内部缓冲存储器中的帧数(注意:目前仅支持DC1394 v 2.x后端)

注意:以上属性在获取时,通过对应的编号进行,上面所列出的属性,从0开始编号;

如: cap=cv2.VideoCapture(video_path)

number_of_frame=cap.get(7)  //获取视频的帧数

来源 opencv-python获取视频时长_weixin_43249191的博客-CSDN博客_opencv获取视频时长
--------------------------------------------------------------------------------------------------------------------------------------------------------------

三、可视化光流

import cv2 as cv
import numpy as np
import os
path = 'path_to_videos'
videos = os.listdir(path)
TVL1 = cv.optflow.DualTVL1OpticalFlow_create()
for video in videos:video_path = path + '/' + videocap = cv.VideoCapture(video_path)ret, frame1 = cap.read()prvs = cv.cvtColor(frame1,cv.COLOR_BGR2GRAY)hsv = np.zeros_like(frame1)hsv[...,1] = 255count = 0while(True):ret, frame2 = cap.read()if not ret:breaknext = cv.cvtColor(frame2,cv.COLOR_BGR2GRAY)# 返回一个两通道的光流向量,实际上是每个点的像素位移值flow = TVL1.calc(prvs,next, None)# 笛卡尔坐标转换为极坐标,获得极轴和极角mag, ang = cv.cartToPolar(flow[...,0], flow[...,1])hsv[...,0] = ang*180/np.pi/2  #角度hsv[...,2] = cv.normalize(mag,None,0,255,cv.NORM_MINMAX)bgr = cv.cvtColor(hsv,cv.COLOR_HSV2BGR)path_ = path + '/' + os.path.basename(video).split('.')[0]if not os.path.exists(path_):os.makedirs(path_)cv.imwrite(path_ + "/frame{0:06d}.jpg".format(count), bgr)count += 1prvs = nextcap.release()cv.destroyAllWindows()

参考资料:win10+python3+opencv3 读取视频中的指定帧并存为图片_li_huifei的博客-CSDN博客

基于opencv,使用python提取视频帧以及提取TVL1光流相关推荐

  1. 使用 OpenCV 和 Python 从视频中快速提取帧

    **更新(2020 年 7 月):**我现在使用并建议使用Decod在 Python 中更快地加载视频.您可以进一步查看原始的 OpenCV 版本.

  2. Python快速从视频中提取视频帧(多线程)

    Python快速提取视频帧(多线程) 今天介绍一种从视频中抽取视频帧的方法,由于单线程抽取视频帧速度较慢,因此这里我们增加了多线程的方法. 1.抽取视频帧 抽取视频帧主要使用了 Opencv 模块. ...

  3. python使用方法视频-python读取视频流提取视频帧的两种方法

    本文实例为大家分享了python读取视频流提取视频帧的具体代码,供大家参考,具体内容如下 方法一:通过imageio库和skimage库 1. 安装环境: pip install imageio pi ...

  4. 用python打开视频_python读取视频流提取视频帧的两种方法

    本文实例为大家分享了python读取视频流提取视频帧的具体代码,供大家参考,具体内容如下 方法一:通过imageio库和skimage库 1. 安装环境: pip install imageio pi ...

  5. python批量提取视频帧

    python批量提取视频帧 python批量提取视频帧,两种提取方式: 按帧数提取,每个视频提取固定帧数,若所取帧数超过视频总帧数,则截取视频所有帧 按时间间隔提取,每个time提取一帧 1. 使用示 ...

  6. 基于 ffmpeg + Webassembly 实现前端视频帧提取

    作者:jordiwang  https://juejin.im/post/6854573219454844935 现有的前端视频帧提取主要是基于 canvas + video 标签的方式,在用户本地选 ...

  7. 【优秀课设】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别 视频随时标注)

    基于OpenCV的Python人脸识别.检测.框选 (遍历目录下所有照片依次识别 视频随时标注) 移步: https://blog.csdn.net/weixin_53403301/article/d ...

  8. opencv提取视频帧,将多张图片组合成视频(C++)

    OpenCV-视频处理-视频处理5191 2 opencv提取视频帧,将多张图片组合成视频(C++) 作者:bit452 参考:http://blog.sina.com.cn/s/blog_5f593 ...

  9. python 视频 特效_ffmpeg-python 任意提取视频帧

    ▶ 环境准备 1.安装 FFmpeg 2.安装 ffmpeg-python pip3 install ffmpeg-python 3.[可选]安装 opencv-python pip3 install ...

最新文章

  1. Spring Boot 项目瘦身指南,瘦到不可思议!
  2. 八个层面比较 Java 8, RxJava, Reactor
  3. Centos7.5源码编译安装nodejs
  4. 协同过滤——基于邻域的算法
  5. Django前后端增删改查
  6. VS2010中 C++创建DLL图解
  7. 周鸿祎:物联网时代的三大威胁
  8. Bootstrap 3: accordion menu 手风琴效果
  9. 为什么需要字节对齐?
  10. sql处理null值
  11. ThinkPHP添加谷歌验证码验证
  12. 设备管理系统未来发展的四大趋势
  13. C语言 指针访问数组,C语言通过指针引用数组
  14. reviewboard 介绍
  15. JS使用递归遍历json对象进行操作
  16. 采用晶体管作为电子元器件的计算机属于,采用晶体管作为电子元器件的计算机属于(...
  17. 9.2 正方形 2711
  18. java公交路线查询微信小程序源码
  19. 图片加载之前显示 加载中或者加载中图片
  20. 网络安全自学笔记04 - 路由器技术

热门文章

  1. python扫雷游戏代码_python实现扫雷游戏的示例
  2. 2022虎符 mva
  3. 矩阵理论| 特殊矩阵:幂等矩阵、投影、正交投影
  4. IntelliJ IDEA2022.1.3版本配置ja-netfilter插件(含插件直接下载地址)
  5. 计算机中级审计职称考试试题,历年中级审计师考题
  6. Redmine与GitLab集成
  7. 页面数据导出为word或者excel
  8. 9.28感想——原来你也这样走过
  9. lumion9教育板更改计算机名,Lumion
  10. html5游戏市场,HTML5游戏的市场契机