使用OpenCV进行简单的场景边界/镜头转换检测

视频地址:https://youtu.be/EYyGN6F1tK0

在本教程中,您将学习如何使用OpenCV实现一个简单的场景边界/镜头过渡动画检测器。

两周前,我和爸爸飞往加州的圣地亚哥度假。

我们乘坐的是第一班从费城起飞的航班,上午10点30分抵达圣地亚哥,但不幸的是,我们的酒店房间还没有准备好,所以我们无法办理登记住宿手续。

我们两个都因为早起而有点累了,更不用说还要坐6个小时的飞机了,所以我们决定去酒店的休息室放松一下,直到我们的房间都准备好了。

我在一个舒适的酒店躺椅上坐下,打开我的iPhone,开始浏览我在飞行中错过的通知。一条来自好友贾斯汀的短信引起了我的注意:

“伙计,我看了昨晚《狂笑蝙蝠侠》的第七期。超级好看。您会爱上它的。您看完后告诉我一声,我们好讨论一下。

我是一个漫画书书呆子,而DC的最新系列——《狂笑蝙蝠侠》,无疑是我今年最喜欢的系列——据贾斯汀说,故事线的最后一期刚刚出版!

我打开谷歌地图,想看看当地有没有漫画书店,我可以在那里买到一本。

不行。

最近的书店在两英里外——我不打算跋涉那么远把我爸爸留在酒店。

我不是很喜欢在屏幕上看漫画的人,但这次我决定破例一次。

我打开iPhone上的comiXology应用程序(这是一款让您购买和下载数字漫画的应用程序),找到了最新一期的《狂笑蝙蝠侠》,付了5美元,把它下载到了我的iPhone上。

现在,您可能会想,在一个数字屏幕上读漫画将是一个可怕的痛苦体验,尤其是像iPhone这样小的屏幕。

在这么小的屏幕上,您究竟该如何处理拖动、缩放和滚动呢?这难道不是一种糟糕的用户体验吗?这可能会毁了阅读漫画体验。

相信我,以前是这样的。

但漫画出版商已经意识到了这一点。

代替强制您使用一个手机PDF阅读器的等价工具去阅读数字漫画,DC、Marvel、comiXology等出版商已经把一些可怜的实习生关在黑暗肮脏的地下室里(希望这是在开玩笑),并强迫他们在漫画中标注每个版面的位置。

现在,我们不必手动滚动到漫画的下一个版面,您所需要做的就是点击手机屏幕的左侧或右侧,然后应用程序会自动为您滚动/缩放!

这是一个非常简洁的功能,虽然我总是喜欢把实体漫画书拿在手里,但自动滚动和缩放功能对于阅读数字漫画来说是一个真正的游戏规则改变者。

当我读完《狂笑蝙蝠侠》第7期(顺便说一句,它绝对棒极了),我开始思考……

如果我能用计算机视觉自动从数字漫画中提取每个版面呢?

一般的算法是这样的:

  1. 当我在comiXology应用程序中阅读漫画时,记录下我的iPhone屏幕。
  2. 使用OpenCV对视频进行后期处理,检测漫画应用程序何时完成缩放、滚动等操作。
  3. 将当前漫画版面保存到磁盘。
  4. 对整个视频长度重复此操作。

最终结果将是一个包含漫画书的每个单独版面的目录!

您可能会认为这样的算法实现起来很有挑战性,也很繁琐,但是一旦您意识到它只是一个场景边界检测的应用,那它就其实很简单!

今天我将向您展示如何实现上面详细介绍的精确算法(并且只需要100行代码)。

使用OpenCV进行简单的场景边界/镜头转换检测

在本教程的第一部分,我们将讨论场景边界和镜头转换检测,包括如何使用计算机视觉算法自动分割视频文件中的剪辑。

在此基础上,我们将研究如何将场景边界检测应用于数字漫画书,本质上是创建一个可以自动从视频中提取漫画书版面的算法。

最后,我们将实现实际的算法并检查结果。

什么是“场景边界”和“镜头转换”?

使用OpenCV进行简单的场景边界/镜头转换检测

图1:电视剧预告片——HBO的《六英尺之下》的边界场景过渡(视频资料)。我们将学习使用OpenCV提取边界场景切换。

电影、电视节目或视频中的“场景边界”或“镜头转换”是制片人和编辑表明当前场景已经完成,下一个场景正在开始的一种自然方式。镜头转换,如果处理得当,对观看视频的人来说是无害的——我们会直觉地认为故事的当前“章节”已经结束,下一个章节正在开始。

最常见的场景边界类型是“淡出到黑暗”,类似于上面的图1。注意,当当前场景结束时,视频淡入黑暗,然后淡入回来,表示下一个场景开始。

利用计算机视觉,我们试图自动找到这些场景边界,使我们能够创建一个“智能视频分割”系统。

这样一个视频分割系统可以用来自动地:

  • 从电影/电视节目中提取场景,将每个场景/剪辑保存在单独的视频文件中。
  • 将某电视台的广告片段进行分割以便进行广告研究。
  • 总结运动节奏较慢的运动,如棒球、高尔夫球和美式橄榄球。

场景边界检测是一个活跃的研究领域,已经存在多年。

如果您有兴趣阅读一些出版物,我建议您使用谷歌Scholar搜索短语“场景边界检测”。

将场景边界检测算法应用到数字漫画书中

使用OpenCV进行简单的场景边界/镜头转换检测

图2:使用一个基于运动检测的OpenCV方法,我们可以用不到100行Python代码从视频中提取边界场景。

在本教程中,我们将通过一个实际应用程序来应用场景边界检测——自动从数字漫画书中提取帧/版面。

您可能会想:

”但是艾德里安,数字漫画书是图像,不是视频呀!您如何将场景边界检测应用到图像中?

您是对的,漫画是图像——但作为一名计算机视觉从业者的一部分就是学习如何不同地看待问题。

使用我的iPhone,我可以:

  • 开始录制我的屏幕
  • 打开comiXology应用程序
  • 在应用程序中打开一个特定的漫画
  • 开始阅读漫画
  • 当我想要前进到下一个版面时,就点击我的屏幕。
  • 我看完漫画后就停止录像

本部分顶部的图2演示了我如何将一本数字漫画书转换为一个视频文件。注意这个应用程序是如何进行拖动、缩放和滚动的。在应用程序完成“移动”漫画后,帧就稳定下来了,留下的就是当前版面。

从这个视频中提取漫画版面的诀窍就是检测移动何时停止,如下图所示:

使用OpenCV进行简单的场景边界/镜头转换检测

图3:检测运动何时停止是我们使用OpenCV和Python从漫画书中提取场景边界的系统的基础。

为了完成这一任务,我们需要一个基本的场景边界检测算法。

项目结构

我们来回顾一下我们的项目结构:

使用OpenCV进行简单的场景边界/镜头转换检测

我们的项目十分简单。

我们只有一个Python脚本detect_scene.py。它读取一个输入视频(比如batman_who_laughs_7.mp4或您自己的一个视频)。然后该脚本会运行我们的边界场景检测方法来从视频中提取帧。每个帧都被输出到output/目录。

使用OpenCV实现我们的场景边界检测器

让我们来实现我们的基本场景边界检测器,稍后我们将使用它来从漫画书中提取版面。

这个算法是基于背景去除/运动检测——如果我们视频中的“场景”在某个给定的时间段内没有任何运动,然后我们就知道漫画应用已经结束了滚动/缩放到某个版面,在这种情况下,我们可以捕获当前版面并将其保存到磁盘。

您准备好实现我们的场景边界探测器了吗?

打开detect_scene.py文件,并插入以下代码:

使用OpenCV进行简单的场景边界/镜头转换检测

第2-5行导入必要的包。这个项目需要安装OpenCV和imutils。我建议您使用pip在虚拟环境中安装OpenCV。

接下来,第8-19行解析我们的命令行参数:

  • --video : 输入视频文件的路径.
  • --output : 用于存储漫画书版面图像的输出目录的路径。
  • --min-percent : 帧运动百分比的默认下界。
  • --max-percent : 帧运动百分比的默认上限。
  • --warmup : 构建背景模型的默认帧数量。

让我们继续,并初始化我们的背景去除器连同其他重要的变量:

使用OpenCV进行简单的场景边界/镜头转换检测

第22行初始化我们的背景去除器模型。我们将在下一个代码块中的while循环中对每个帧应用它。

第28-30行然后初始化三个内务管理变量。captured的布尔值表示是否完成了捕捉一个帧。两个计数器被初始化为0:

  • total表示我们捕获了多少帧
  • frames表示我们处理了多少视频中的帧

第34行使用指定的视频文件通过终端中的命令行参数来初始化我们的视频流。目前帧的尺寸被设置为None。

让我们开始对视频帧进行循环:

使用OpenCV进行简单的场景边界/镜头转换检测

第40行从视频文件中抓取下一个frame。

随后,第49行对该帧进行复制(以便我们稍后将原始帧保存到磁盘),第50行调整其大小。帧越小,我们的算法就运行得越快。

第51行应用背景去除,生成我们的mask。mask中的白色像素是我们的前景,黑色像素表示背景。

第 54和55行应用了一系列形态学操作来消除噪声。

第62行计算“前景”与“背景”mask的百分比。接下来,我们将分析此百分比p以确定运动是否已经停止:

使用OpenCV进行简单的场景边界/镜头转换检测

第67行比较前景像素百分比p和“min_percent”常量。如果 (1)p小于N%则表示帧具有运动,(2)我们还没有captured这个帧,(3)我们已经完成了准备工作,那么我们将把这个漫画场景保存到磁盘!

假设我们正在保存这个帧,我们会:

  • 在“Captured”窗口中显示该frame(第70行)并将其标记为captured(第71行)。
  • 构建我们的filename和路径(第75-76行)。
  • 增加写入磁盘的版面总数(第77行)。
  • 将orig帧写入磁盘(第81行)。

否则,我们将captured标记为False(第86和87行),这表明上面的if语句没有进行传递,并且该帧没有被写入磁盘。

总的来说,我们将显示frame和mask,直到我们处理完所有frame:

使用OpenCV进行简单的场景边界/镜头转换检测

frame和 mask将一直被显示,直到按下q键或视频处理过程中没有更多的帧。

在下一节中,我们将对结果进行分析。

场景边界检测结果

现在我们已经实现了我们的场景边界检测器,让我们来尝试一下。

请确保您已经使用本教程的“下载”部分下载了本指南的源代码和示例视频。

然后,打开一个终端并执行以下命令:

使用OpenCV进行简单的场景边界/镜头转换检测

使用OpenCV进行简单的场景边界/镜头转换检测

图4:我们的Python + OpenCV场景边界/镜头切换检测算法是基于背景检测方法来确定何时运动已经停止。当运动停止时,版面被捕获并保存到磁盘。

图4显示了我们的漫画书版面提取器的运行情况。

我们的算法能够检测应用程序何时通过缩放、滚动等方式自动“移动”漫画页面——当移动停止时,我们将其视为场景边界。在我们最终目标的上下文中,这个场景边界标志着我们何时已经到达了漫画的下一个版面。

然后我们将这个版面保存到磁盘,然后继续监视视频文件,直到下一次移动发生,这表明我们正在移动到漫画中的下一个版面。

如果您在处理视频之后检查output/目录的内容,您会看到我们已经成功地提取了漫画中的每个版面:

使用OpenCV进行简单的场景边界/镜头转换检测

图5:如图所示,每个漫画版面帧被作为一个图像文件输出到磁盘的output/目录中。本场景边界检测系统是采用OpenCV和Python语言构建的。

我已经包括了一个完整的演示视频,包括我的评论,如下:

【视频地址】https://youtu.be/EYyGN6F1tK0

正如我在这篇文章前面提到的,作为一名成功的计算机视觉从业者,我们通常需要从不同的角度来看待问题——有时您可以改变视频处理算法的用途,并将它们应用到图像上,只需弄清楚如何获取图像并将其捕获为视频。

在这篇文章中,我们能够应用场景边界检测来从漫画书中提取版面,只需通过comiXology应用程序录制我们自己阅读漫画的过程!

有时您所需要的只是一个稍微不同的观点来解决一个潜在的具有挑战性的问题。

素材

  • 音乐:“科幻小说”——本杰明·蒂斯索
  • 漫画:《狂笑蝙蝠侠》第七期 —— DC漫画(作者:Scott Snyder,美术:Jock)
  • 备注: 我在示例视频中只使用了漫画的前几帧。我没有包括整个漫画,因为那将是相当严重的侵权!重申一下,此演示仅用于教学目的。

总结

在本教程中,您学习了如何使用OpenCV实现一个简单的场景边界检测算法。

我们特别将此算法应用于数字漫画书,使我们能够自动提取漫画书的每个单独版面。

您也可以把这个算法应用到您自己的视频文件中。

如果您有兴趣学习更多关于场景边界检测算法的知识,请使用这篇文章底部的评论来告诉我——我可能会决定在将来更详细地介绍这些算法!

希望您喜欢这个教程!

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

译者:好酒不上头

相关推荐