如果想要自动截取一个视频的图片,又不想手动暂停截取,那可以试试用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实现相关推荐

  1. 怎么把动态图从python弄下来_Python将视频或者动态图gif逐帧保存为图片的方法

    本文是基于opencv将视频和动态图gif保存为图像帧.可以根据输入视频格式的不同,修改第21行. 对动图的处理不同于视频,PIL库包含对图像序列的基本支持.当打开gif图像时,自动加载第一帧.当图像 ...

  2. python怎么存为动图_Python将视频或者动态图gif逐帧保存为图片的方法

    本文是基于opencv将视频和动态图gif保存为图像帧.可以根据输入视频格式的不同,修改第21行. 对动图的处理不同于视频,PIL库包含对图像序列的基本支持.当打开gif图像时,自动加载第一帧.当图像 ...

  3. Python将视频或者动态图gif逐帧保存为图片

    本文是基于opencv将视频和动态图gif保存为图像帧.可以根据输入视频格式的不同,修改第21行. 对动图的处理不同于视频,PIL库包含对图像序列的基本支持.当打开gif图像时,自动加载第一帧.当图像 ...

  4. 使用Java实现,PDF转换成图片(每一页保存为一张图片)

    基于maven项目 1.引入jar包 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> <de ...

  5. python代码实现视频与图片之间的互相转换

    一.视频与图片 1.视频   视频其实就是若干张图片叠加起来,包含了图像的运行信息.   由于人眼识别的帧率是有限的,因此在单位时间内给人眼观看的图像超过一定数目的时候,给人的感觉就好像画面是运动的, ...

  6. Python从视频抽取帧保存为图片

    Python从视频抽取帧保存为图片 flyfish 版本3.6以上 import cv2 from tqdm import tqdm #视频文件所在的路径 video_path = "/me ...

  7. Python视频抽帧,视频转图片帧并保存

    注(新方法):如果不想用python跑,可以直接终端命令行安装ffmpeg包,然后cd到含有视频文件夹的位置,终端执行: for f in *.mp4; do mkdir -p "${f}_ ...

  8. php ffmpeg截图,php ffmpeg截取视频第一帧保存为图片的方法

    php ffmpeg截取视频第一帧保存为图片的方法 $xiangmupath = $this->getxiangmupath(); $filename = 'chengshi'; $cmd = ...

  9. 【FFmpeg】java实现利用ffmpeg视频上传转码同时截取一帧保存为同名图片,并获取视频分辨率

    〇.前情提要 完成了视频上传,接下来是给上传的视频保存一张同名的jpg文件在同样文件夹中,并且获取到视频的分辨率. macOS Catalina 10.15.1 ffmpeg version 4.3. ...

最新文章

  1. python获取数据库查询的元数据_Python数据库、MySQL存储引擎、使用分区表、更改表结构、获取数据库元数据...
  2. GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。
  3. iOS开发之详解正则表达式
  4. Android开发之非常好用的日志工具类(公司项目挖出来的)
  5. 如何在 .NET Core 中获取 CPU 使用率
  6. 第一次冲刺阶段(三)
  7. EXCEL同列多个重复数值去重保留一个
  8. 开启 C++ 生活 -- 第一个 C++ 程序
  9. weixin-api生成二维码
  10. 手机号码归属地查询练习
  11. 基于java人脸识别考勤签到系统设计与实现毕业设计毕设作品
  12. java多线程计算pi_Java多线程——计算1-20阶乘和
  13. 开源免费录屏和直播软件OBS Studio教程
  14. Django中文文档2.0
  15. JavaScript学习总结
  16. 前端图片压缩(几乎无损)
  17. Yolo 一小时学会基本操作
  18. 图片在线编辑器怎么使用教程
  19. 微信公众平台实现天气预报功能
  20. 淘宝电商需求文档的书写

热门文章

  1. 计算机应用职业的外部环境,完整的职业生涯规划书范文
  2. Mac m1 python软件环境安装配置
  3. linux防火墙开放端口无法打开,LInux 开启防火墙网站无法访问问题
  4. 关于配置ssl证书后网页无法访问的原因
  5. ev1百家云视频解密工具、ev1视频提取工具,支持Windows、MacOS、Linux
  6. MongoDB+模板引擎 项目学习 ---学生档案管理
  7. 使用c#捕获usb扫描枪扫描二维码、条形码结果(支持中文版)
  8. r语言和rstudio_R和RStudio简介
  9. 狂神说Spring学习笔记————(一发入魂)
  10. 题解 P1757 【通天之分组背包】