基于opencv,使用python提取视频帧以及提取TVL1光流
处理视频,最常用的开源工具箱非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光流相关推荐
- 使用 OpenCV 和 Python 从视频中快速提取帧
**更新(2020 年 7 月):**我现在使用并建议使用Decod在 Python 中更快地加载视频.您可以进一步查看原始的 OpenCV 版本.
- Python快速从视频中提取视频帧(多线程)
Python快速提取视频帧(多线程) 今天介绍一种从视频中抽取视频帧的方法,由于单线程抽取视频帧速度较慢,因此这里我们增加了多线程的方法. 1.抽取视频帧 抽取视频帧主要使用了 Opencv 模块. ...
- python使用方法视频-python读取视频流提取视频帧的两种方法
本文实例为大家分享了python读取视频流提取视频帧的具体代码,供大家参考,具体内容如下 方法一:通过imageio库和skimage库 1. 安装环境: pip install imageio pi ...
- 用python打开视频_python读取视频流提取视频帧的两种方法
本文实例为大家分享了python读取视频流提取视频帧的具体代码,供大家参考,具体内容如下 方法一:通过imageio库和skimage库 1. 安装环境: pip install imageio pi ...
- python批量提取视频帧
python批量提取视频帧 python批量提取视频帧,两种提取方式: 按帧数提取,每个视频提取固定帧数,若所取帧数超过视频总帧数,则截取视频所有帧 按时间间隔提取,每个time提取一帧 1. 使用示 ...
- 基于 ffmpeg + Webassembly 实现前端视频帧提取
作者:jordiwang https://juejin.im/post/6854573219454844935 现有的前端视频帧提取主要是基于 canvas + video 标签的方式,在用户本地选 ...
- 【优秀课设】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别 视频随时标注)
基于OpenCV的Python人脸识别.检测.框选 (遍历目录下所有照片依次识别 视频随时标注) 移步: https://blog.csdn.net/weixin_53403301/article/d ...
- opencv提取视频帧,将多张图片组合成视频(C++)
OpenCV-视频处理-视频处理5191 2 opencv提取视频帧,将多张图片组合成视频(C++) 作者:bit452 参考:http://blog.sina.com.cn/s/blog_5f593 ...
- python 视频 特效_ffmpeg-python 任意提取视频帧
▶ 环境准备 1.安装 FFmpeg 2.安装 ffmpeg-python pip3 install ffmpeg-python 3.[可选]安装 opencv-python pip3 install ...
最新文章
- Spring Boot 项目瘦身指南,瘦到不可思议!
- 八个层面比较 Java 8, RxJava, Reactor
- Centos7.5源码编译安装nodejs
- 协同过滤——基于邻域的算法
- Django前后端增删改查
- VS2010中 C++创建DLL图解
- 周鸿祎:物联网时代的三大威胁
- Bootstrap 3: accordion menu 手风琴效果
- 为什么需要字节对齐?
- sql处理null值
- ThinkPHP添加谷歌验证码验证
- 设备管理系统未来发展的四大趋势
- C语言 指针访问数组,C语言通过指针引用数组
- reviewboard 介绍
- JS使用递归遍历json对象进行操作
- 采用晶体管作为电子元器件的计算机属于,采用晶体管作为电子元器件的计算机属于(...
- 9.2 正方形 2711
- java公交路线查询微信小程序源码
- 图片加载之前显示 加载中或者加载中图片
- 网络安全自学笔记04 - 路由器技术