使用Python,OpenCV进行简单的场景边界/拍摄转换检测器

  • 1. 效果图
  • 2. 实现
    • 2.1 步骤
    • 2.2 什么是“场景边界”和“拍摄过渡”?
    • 2.3 代码目录结构
  • 2. 源码
  • 参考

这篇博客起源于朋友分享蝙蝠侠7更新了,而我没有办法去最近的书店买书。于是下载了电子书,电子书已经实现了左击或者右击自动缩放、滚动。

然而我想自己通过计算机视觉的技术实现——自动从数字漫画中提取每个面板,缩放滚动等;

核心是场景边界检测算法,这篇博客将用100行代码实现此算法;

这篇博客介绍了如何使用OpenCV实现简单场景边界检测算法,并将该算法应用于数字漫画书籍,自动提取了漫画书的每个单独面板。您也可以使用您自己的视频。

1. 效果图

原始视频帧 VS Mask VS 截取的动画帧

过程图

2. 实现

2.1 步骤

  1. 当正在阅读Comixology App中的漫画时,记录iPhone屏幕;
  2. 通过使用OpenCV来检测漫画应用完成缩放,滚动等时的后处理视频;
  3. 将当前的漫画书面板保存到磁盘;
  4. 重复视频的整个长度。

最终结果将是包含漫画书的每个单板的目录!

2.2 什么是“场景边界”和“拍摄过渡”?

最常见的场景边界是“淡入黑色”,从一个场景到一个场景的过渡;
通过实际应用程序应用场景边界检测 - 从数字漫画书自动提取帧/面板。

场景过渡可以进行检测前景的非黑像素,达到某个值;

2.3 代码目录结构

2. 源码

# 它读取输入视频,然后脚本运行边界场景检测方法以从视频中提取帧。每个帧将导出到输出/output# 实现基本场景边界检测器,稍后会用于从漫画书中提取面板。
# 该算法基于背景减法/运动检测 - 如果视频中的“场景”在视频中没有任何动作,那么认为漫画内容已完成滚动/缩放给面板,就可以捕获当前面板并将其保存到磁盘。# USAGE
# python detect_scene.py --video xl.mp4 --output output# 导入必要的包
import argparse
import imutils
import cv2
import os# 构建命令行参数及解析
# --video 视频文件,必须项
# --output 漫画帧输出路径 必须项
# --min-percent 运动百分比默认下边界
# --max-percent 帧运动百分比的默认上边界。
# --暖身 构建背景模型的默认帧数
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", required=True, type=str,help="path to input video file")
ap.add_argument("-o", "--output", required=True, type=str,help="path to output directory to store frames")
ap.add_argument("-p", "--min-percent", type=float, default=1.0,help="lower boundary of percentage of motion")
ap.add_argument("-m", "--max-percent", type=float, default=10.0,help="upper boundary of percentage of motion")
ap.add_argument("-w", "--warmup", type=int, default=200,help="# of frames to use to build a reasonable background model")
args = vars(ap.parse_args())# 初始化背景减法器模型
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG()# 初始化一个布尔值显示是否帧被捕获,以及俩个整数,一个是已捕获帧数,一个是已处理帧数
captured = False
total = 0
frames = 0# 打开视频流指针,初始化帧的宽度合高度
vs = cv2.VideoCapture(args["video"])
(W, H) = (None, None)# 遍历视频帧
while True:# 获取视频帧(grabbed, frame) = vs.read()# 如果帧为None,表明已至视频结束,终止循环if frame is None:break# 克隆当前帧,等比例缩放为宽度600(帧越小,算法越快),然后应用背景减法检测器orig = frame.copy()frame = imutils.resize(frame, width=300)mask = fgbg.apply(frame)# 应用一系列腐蚀膨胀清除噪音mask = cv2.erode(mask, None, iterations=2)mask = cv2.dilate(mask, None, iterations=2)# 如果宽度、高度为None,获取mask的维度(宽、高)if W is None or H is None:(H, W) = mask.shape[:2]# 计算前景mask的百分比p = (cv2.countNonZero(mask) / float(W * H)) * 100# 如果前景少于N%,则认为运动已停止,捕获当前帧并保存在磁盘if p < args["min_percent"] and not captured and frames > args["warmup"]:# 展示捕获的帧,并更新捕获变量cv2.imshow("Captured", frame)# cv2.waitKey(0)   # 查看捕获帧captured = True# 构建输出帧路径及文件名,更新捕获帧计数器filename = "{}.png".format(total)path = os.path.sep.join([args["output"], filename])total += 1# 保存原始的高分辨率帧到磁盘print("[INFO] saving {}".format(path))cv2.imwrite(path, orig)# 否则,帧场景正在变化,预热模型中,更新捕获变量为Falseelif captured and p >= args["max_percent"]:captured = False# 显示帧并检测是否有按键cv2.imshow("Frame", frame)cv2.imshow("Mask", mask)key = cv2.waitKey(1) & 0xFF# 按下‘q’键,退出循环if key == ord("q"):break# 增加已处理帧计数器frames += 1# 做一些清理工作,释放指针
vs.release()

参考

  • https://www.pyimagesearch.com/2019/08/19/simple-scene-boundary-shot-transition-detection-with-opencv/

使用Python,OpenCV实现简单的场景边界/拍摄转换检测器相关推荐

  1. Python Opencv 之 简单的视频裁剪功能的实现

    Python Opencv 之 简单的视频裁剪功能的实现 目录 Python Opencv 之 简单的视频裁剪功能的实现 一.简单介绍 二.实现原理 三.注意实现 四.效果预览 五.实现步骤 这里实现 ...

  2. opencv自动裁切_荐Python Opencv 之 简单的视频裁剪功能的实现

    Python Opencv 之 简单的视频裁剪功能的实现 目录 一.简单介绍 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随 ...

  3. python opencv 绘制简单图形

    09-python opencv 绘制简单图形 09-python opencv 绘制简单图形 概述 实现过程 引用与创建空图 绘制直线 绘制矩形 绘制圆 绘制椭圆 添加文字 显示图像 源代码 运行结 ...

  4. python+opencv最简单的人脸识别入门

    0前置操作 安装python(最新3.10即可) 安装pycharm(社区版即可) 安装opencv-python(cmd输入pip install opencv-python即可,嫌慢用国内镜像也可 ...

  5. cv2.threshold() 阈值:使用Python,OpenCV进行简单的图像分割

    图像分割有多种形式. 聚类.压缩.边缘检测.区域增长.图分区.分水岭等等:(Clustering. Compression. Edge detection. Region-growing. Graph ...

  6. python + opencv 创建简单渐变色

    首先确定渐变色的初始色和终止色 本文选取初始色(10,250,25)终止色(255,92,0),可在ps中查看,如下图所示:首先创建一个矩阵,500*500 则从初始色到终止色为渐变过程,每个点对应的 ...

  7. Python+Opencv实现简单PCA人脸识别

    基本原理:人脸识别-PCA特征脸_Python_萬仟网 上面那个链接被识别成不安全网址,谨慎访问吧 PCA,principal Component Analysis(主成成分分析方法) 1.基本原理 ...

  8. Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储

    原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...

  9. 体感游戏 | 手势识别玩飞机大战游戏(二) Python+OpenCV实现简易手势识别功能

    后面将分四篇文章来介绍实现手势识别控制飞机大战游戏的功能,它们分别是: 使用Pygame实现简易飞机大战小游戏 使用Python+OpenCV实现简单手势识别 使用OpenCV实现手势识别玩飞机大战游 ...

最新文章

  1. 第三周 9.13-9.19
  2. 测开2 - Python(文件操作)
  3. CSDN 十大技术主题盘点-云原生篇
  4. Ddos攻击攻击与防御
  5. 给表空间增加数据文件
  6. Eclipse安装中文语言包
  7. Java实现简单的银行管理系统(最基本的功能/易上手)
  8. 金蝶K3 webservice接口
  9. 正确使用计算机键盘的方法是,电脑键盘指法练习的方法
  10. (转)PQ分区魔术师中文版分区教程
  11. 首席新媒体运营黎想教程:线上活动推广策划及方案解析
  12. Excel函数之~计算日期、天数、星期
  13. PHP生成PDF-TCPDF
  14. c语言课程设计湖南工程学院,湖南工程学院15级C语言课程设计报告.doc
  15. 量子计算机没有热量,最新研究:量子气体不会带走热量
  16. 1元云购微信支付功能开发 - 1元云购网站开发
  17. win11 怎么开性能模式
  18. 谷歌搜索揭示人性最黑暗的秘密
  19. pheatmap进行热图绘制
  20. [!] Authentication token is invalid or unverified. Either verify it with the email that was sent or

热门文章

  1. 2021年大数据Flink(三十九):​​​​​​​Table与SQL ​​​​​​总结 Flink-SQL常用算子
  2. Cocos Creator 音频文件Audio的绑定与使用(TypeScript)
  3. mysql error number 1130,[转]mysql error number 1130的解决方法
  4. 1977中文版_历年星云、雨果获奖长篇中文版汇总
  5. Python 的基本数据类型
  6. java.io.FileNotFoundException: /storage/emulated/0/one.mp4 (Permission denied)
  7. Python的数据库操作(Sqlalchemy)
  8. Java程序猿面试题集(181- 199)
  9. 原来AGILE就是这么一回事啊!
  10. ORB_SLAM2中的Sim3变换