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

时间:2014-06-13 06:48:22

标签: android opencv video

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

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

  2. 我读到JCodec是一个用于编码/解码视频的库。 JCodec会让我完成我的任务吗?如果是的话,你知道任何例子。

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

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

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

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

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

    希望我能解释一切。

2 个答案:

答案 0 :(得分:2)

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

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

  1. 使用FrameGrabber
  2. 从视频中抓取三个通道的IplImage帧
  3. 将抓取的三通道帧转换为四通道IplImage帧
  4. 将四通道帧转换为Android位图图像
  5. 将Android位图图像转换为OpenCV Mat框架
  6. 处理OpenCV Mat框架
  7. 将已处理的Mat帧转换为Android位图图像
  8. 将Android位图图像转换为四通道IplImage帧
  9. 将四通道IplImage帧转换为三通道IplImage
  10. 使用FrameRecorder
  11. 将三个频道的IplImage存储为视频中的帧

答案 1 :(得分:0)

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

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

OpenCv grab() documentation