视频到图片(每隔几帧保存一张图片)opencv实现
如果想要自动截取一个视频的图片,又不想手动暂停截取,那可以试试用opencv自动截取(比如想要自动截取喜欢电影的经典台词与图片)。
背景说明:一个小意外,录屏视频没有声音,想着把视频里的PPT截取出来,1个小时的视频,自己挨个截取太慢了,灵机一动用opencv试试吧。
问题1:刚开始代码将每帧都进行了截取,发现一共42798帧,太多了,而且截取图片有很多重复的。
解决:隔帧截取保存,隔多少,暂时是默认了80,效果不错(可以根据自己的视频以及效果改动)。(代码如下)
问题2:能不能让代码自己根据图片差异判断保存?只留下变化的图片,
解决:解决见第二个程序。程序最核心的代码 skimage.measure.compare_ssim(X,Y,...) 计算两幅图像之间的平均结构相似性指数,可参考我的另一个博客https://mp.csdn.net/console/editor/html/109428505
注意:
- 想要尝试代码,配置opencv,pip install -i https://mirrors.aliyun.com/pypi/simple opencv-python==4.1.0.25
详情见:https://blog.csdn.net/dujuancao11/article/details/107468687- cap = cv2.VideoCapture('2.mp4') 2.mp4改为你的视频名字
- 以下代码只尝试了MP4类型文件,别的暂时没有尝试,有需要再来更新改进吧。
# 视频分解图片
# 1 load 2 info 3 parse 4 imshow imwrite
import cv2
import os
# 获取一个视频打开cap 参数1 file name
#cap = cv2.VideoCapture("1.mp4")
#cv2.VideoCapture(0, cv2.CAP_DSHOW) # 摄像头截取
cap = cv2.VideoCapture('2.mp4')
isOpened = cap.isOpened # 判断是否打开‘
print(isOpened)
# 获取信息 宽高
n_frame = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print('总帧数:',n_frame) # 整个视频的总帧数
fps = cap.get(cv2.CAP_PROP_FPS) # 帧率 每秒展示多少张图片
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # w
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # h
print('帧数、宽度、高度分别为:',fps,width,height) # 帧率 宽 高
i = 0 # 记录读取多少帧
frameFrequency = 80 # 每frameFrequency保存一张图片
while(isOpened):# 结束标志是否读取到最后一帧if i == n_frame:breakelse:i = i+1(flag,frame) = cap.read() # read方法 读取每一张 flag是否读取成功 frame 读取内容fileName = 'image'+str(i)+'.jpg' # 名字累加# True表示读取成功 进行·写入# if 判断需要有冒号#if flag == True:outPutDirName = './d/' # 设置保存路径if not os.path.exists(outPutDirName):# 如果文件目录不存在则创建目录os.makedirs(outPutDirName)if i % frameFrequency == 0:print(fileName)cv2.imwrite(outPutDirName+fileName,frame,[cv2.IMWRITE_JPEG_QUALITY,100])# 质量控制 100最高
print('end!')
代码运行结果
import os
import cv2
from skimage.measure import compare_ssim
'''相邻两个文件比较相似度,相似就把第二个加到新列表(删除列表)里,然后进行新列表去重,统一删除。例如:有文件1-10,首先1和2相比较,若相似,则把2加入到新列表里,再接着2和3相比较,若不相似,则继续进行3和4比较...一直比到最后,然后删除新列表里的图片只对于连续图片(例一个视频里截下的图片)准确率也较高,其效率高'''
def delete(filename1):os.remove(filename1)
if __name__ == '__main__':path = r'./E/' # 文件所在路径img_path = pathimgs_n = [] # 新建的删除列表i = 0 # 用来统计删了第几张图片img_files = [os.path.join(rootdir, file) for rootdir, _, files in os.walk(path) for file in files if(file.endswith('.jpg'))]for currIndex, filename in enumerate(img_files):if not os.path.exists(img_files[currIndex]):print('not exist', img_files[currIndex])breakimg = cv2.imread(img_files[currIndex])img1 = cv2.imread(img_files[currIndex + 1])# https://cloud.tencent.com/developer/section/1414961 开发者手册链接# 本程序最核心的代码# skimage.measure.compare_ssim(X,Y,...)# 计算两幅图像之间的平均结构相似性指数ssim = compare_ssim(img, img1, multichannel=True)# 相似度大于0.9就加入删除列表if ssim > 0.9:imgs_n.append(img_files[currIndex + 1]) # 加入新建删除列表i = i+1 # 每加入一个就会删除print(img_files[currIndex], img_files[currIndex + 1], ssim)print('删除次数', i)# 否则不删除,给出两图片的相似度else:print('small_ssim',img_files[currIndex], img_files[currIndex + 1], ssim)currIndex += 1if currIndex >= len(img_files)-1:breakfor image in imgs_n:delete(image)
- 运行结果
可发现共删除294张图片
处理前文件夹情况(共403):
处理后文件夹情况(剩下109)点开检查发现相似图片基本删除,达到目标:
视频到图片(每隔几帧保存一张图片)opencv实现相关推荐
- 怎么把动态图从python弄下来_Python将视频或者动态图gif逐帧保存为图片的方法
本文是基于opencv将视频和动态图gif保存为图像帧.可以根据输入视频格式的不同,修改第21行. 对动图的处理不同于视频,PIL库包含对图像序列的基本支持.当打开gif图像时,自动加载第一帧.当图像 ...
- python怎么存为动图_Python将视频或者动态图gif逐帧保存为图片的方法
本文是基于opencv将视频和动态图gif保存为图像帧.可以根据输入视频格式的不同,修改第21行. 对动图的处理不同于视频,PIL库包含对图像序列的基本支持.当打开gif图像时,自动加载第一帧.当图像 ...
- Python将视频或者动态图gif逐帧保存为图片
本文是基于opencv将视频和动态图gif保存为图像帧.可以根据输入视频格式的不同,修改第21行. 对动图的处理不同于视频,PIL库包含对图像序列的基本支持.当打开gif图像时,自动加载第一帧.当图像 ...
- 使用Java实现,PDF转换成图片(每一页保存为一张图片)
基于maven项目 1.引入jar包 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> <de ...
- python代码实现视频与图片之间的互相转换
一.视频与图片 1.视频 视频其实就是若干张图片叠加起来,包含了图像的运行信息. 由于人眼识别的帧率是有限的,因此在单位时间内给人眼观看的图像超过一定数目的时候,给人的感觉就好像画面是运动的, ...
- Python从视频抽取帧保存为图片
Python从视频抽取帧保存为图片 flyfish 版本3.6以上 import cv2 from tqdm import tqdm #视频文件所在的路径 video_path = "/me ...
- Python视频抽帧,视频转图片帧并保存
注(新方法):如果不想用python跑,可以直接终端命令行安装ffmpeg包,然后cd到含有视频文件夹的位置,终端执行: for f in *.mp4; do mkdir -p "${f}_ ...
- php ffmpeg截图,php ffmpeg截取视频第一帧保存为图片的方法
php ffmpeg截取视频第一帧保存为图片的方法 $xiangmupath = $this->getxiangmupath(); $filename = 'chengshi'; $cmd = ...
- 【FFmpeg】java实现利用ffmpeg视频上传转码同时截取一帧保存为同名图片,并获取视频分辨率
〇.前情提要 完成了视频上传,接下来是给上传的视频保存一张同名的jpg文件在同样文件夹中,并且获取到视频的分辨率. macOS Catalina 10.15.1 ffmpeg version 4.3. ...
最新文章
- python获取数据库查询的元数据_Python数据库、MySQL存储引擎、使用分区表、更改表结构、获取数据库元数据...
- GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。
- iOS开发之详解正则表达式
- Android开发之非常好用的日志工具类(公司项目挖出来的)
- 如何在 .NET Core 中获取 CPU 使用率
- 第一次冲刺阶段(三)
- EXCEL同列多个重复数值去重保留一个
- 开启 C++ 生活 -- 第一个 C++ 程序
- weixin-api生成二维码
- 手机号码归属地查询练习
- 基于java人脸识别考勤签到系统设计与实现毕业设计毕设作品
- java多线程计算pi_Java多线程——计算1-20阶乘和
- 开源免费录屏和直播软件OBS Studio教程
- Django中文文档2.0
- JavaScript学习总结
- 前端图片压缩(几乎无损)
- Yolo 一小时学会基本操作
- 图片在线编辑器怎么使用教程
- 微信公众平台实现天气预报功能
- 淘宝电商需求文档的书写
热门文章
- 计算机应用职业的外部环境,完整的职业生涯规划书范文
- Mac m1 python软件环境安装配置
- linux防火墙开放端口无法打开,LInux 开启防火墙网站无法访问问题
- 关于配置ssl证书后网页无法访问的原因
- ev1百家云视频解密工具、ev1视频提取工具,支持Windows、MacOS、Linux
- MongoDB+模板引擎 项目学习 ---学生档案管理
- 使用c#捕获usb扫描枪扫描二维码、条形码结果(支持中文版)
- r语言和rstudio_R和RStudio简介
- 狂神说Spring学习笔记————(一发入魂)
- 题解 P1757 【通天之分组背包】