通过python-opencv对视频逐帧截取

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过python-opencv对视频逐帧截取相关的知识,希望对你有一定的参考价值。

参考技术A 请到我的个人博客获得更好的观看体验 。

通过python-opencv对视频进行逐帧截取,仅需修改两个参数。

在 Android 上的 OpenCV 中逐帧处理视频

【中文标题】在 Android 上的 OpenCV 中逐帧处理视频【英文标题】:Process video frame by frame in OpenCV on Android 【发布时间】:2014-06-13 06:48:22 【问题描述】:

我的目标如下: 我必须读取存储在 SD 卡上的视频,逐帧处理,然后再次将其存储在 SD 卡上的新文件中。问题是 OpenCV4Android 没有附带视频编码器/解码器,因为它不包含 ffmpeg。此外,使用 JavaCV 处理图像对我来说不是一个选项,因为代码已经用本机 OpenCV 编写,我通过 JNI 访问它们。我在 *** 和 Google 的其他部分上做了很多阅读。但我没有找到解决方案。

    JavaCV 允许我逐帧读取视频并逐帧存储。但是,我无法将视频转换为普通 OpenCV4Android 可以处理的普通 OpenCV Mat 对象。

    我了解到 JCodec 作为一个用于编码/解码视频的库。 JCodec 会允许我完成我的任务吗?如果是,你知道任何例子吗?

    为 Android 编译 FFMPEG 也是一种选择。但是,我认为自己编写 FrameGrabber 和 FrameRecorder 有点矫枉过正。我认为除了 JavaCV 之外,还必须存在一些解决方案。

    从 API 18 开始,Android 中有 MediaCodec 和 MediaMuxer。也许他们可以帮助我?

所以让我们来满足我的要求。我目前的目标是 Android API 19,所以我有我需要的所有可用功能。对我来说最重要的要求如下:

如果我处理 10 秒 30 FPS 的视频,结果也应该是 10 秒 30 FPS 的视频。所以我想要一个精确的视频副本,但 OpenCV 在每一帧中添加了一些绘图。例如,通过 Python 使用 OpenCV 可以通过使用 VideoWriter 类和 VideoInput 类来完成此任务。我需要在 Android 上具有相同的功能。

我想知道到目前为止没有人遇到过这个问题(或者我没有找到它)。

希望我解释了一切。

【问题讨论】:

嗨@Vion。只是想问您是否找到了解决方案?我现在面临几乎相同的问题...... 是的,我找到了解决方案(见下文) 【参考方案1】:

@Alekz:是的,我找到了解决方案。即使是额外的开销,对于我的研究项目来说也足够了。

该解决方案涵盖了 OpenCV 4 Android 和 JavaCV 的使用。我首先使用 JavaCV 逐帧读取。之后,我将此帧转换为 OpenCV 使用的格式,处理该帧。最后,我要么直接在屏幕上显示处理后的帧,要么将其转换回 JavaCV 并将其存储在一个新文件中。您可以在下面找到不同使用的帧格式的详细解决方案。

    使用 FrameGrabber 从视频中抓取三通道 IplImage 帧 将抓取的三通道帧转换为四通道 IplImage 帧 将四通道帧转换为Android Bitmap图像 将 Android 位图图像转换为 OpenCV Mat 框架 处理 OpenCV Mat 框架 将处理后的 Mat 帧转换为 Android 位图图像 将Android Bitmap图像转换为四通道IplImage帧 将四通道IplImage帧转换为三通道IplImage 使用 FrameRecorder 将三通道 IplImage 存储为视频中的帧

【讨论】:

感谢分享,@Vion! 我得到的第一个解决方案。但这在某一点上是不是计算成本太高了? @Vion 你的解决方案有一些公共代码吗?这对我有很大的帮助。【参考方案2】:

您可以在OpenCV中使用VideoCapture打开一个视频文件,然后使用grab获取下一帧。

是否有您需要支持的特定视频编解码器?

OpenCv grab() documentation

【讨论】:

以上是关于通过python-opencv对视频逐帧截取的主要内容,如果未能解决你的问题,请参考以下文章

python-opencv-视频的读取与分解

如何提取视频中一帧图片

在 Android 上的 OpenCV 中逐帧处理视频

怎么从视频中提取一张照片

项目实训---视频中单个目标对象逐帧检查

如何使用 OpenCV 和 Python 在视频流中逐帧处理视频图像