在Android上使用OpenCV逐帧处理视频

8
我的目标如下: 我需要读取存储在SD卡上的视频,逐帧进行处理,然后再将其存储到SD卡上的新文件中。问题在于,OpenCV4Android没有视频编码器/解码器,因为它不包括ffmpeg。此外,使用JavaCV处理图像对我来说也不是一个选择,因为代码已经用本地OpenCV编写,我通过JNI访问它们。我在stackoverflow和Google的其他部分都做了很多阅读,但没有找到解决方案。
以下是我的要求:
1. JavaCV允许我逐帧读取视频并逐帧存储它。但是,我无法将视频转换为可以由通常的OpenCV4Android处理的普通OpenCV Mat对象。
2. 我了解到JCodec是用于编码/解码视频的库。JCodec是否能够满足我的任务?如果是,请提供示例。
3. 编译FFMPEG用于Android也是一种选择。但是,我认为自己编写FrameGrabber和FrameRecorder有点过头了。我认为除了JavaCV的解决方案之外,必须存在某些解决方案。
4. 从API 18开始,Android有MediaCodec和MediaMuxer。也许它们可以帮助我?
所以,让我们来看看我的要求。我当前的目标是针对Android API 19,因此我拥有所需的每个函数。对我来说最重要的要求是:
如果我使用30 FPS处理10秒的视频,则结果也应为30 FPS的10秒视频。因此,我想得到视频的精确副本,但是每帧都添加了一些OpenCV绘图。例如,使用Python通过VideoWriter类和VideoInput类可以完成此任务。我需要在Android上获得相同的功能。
我想知道为什么以前没有人遇到这个问题(或者我没有找到)。希望我解释清楚了。

嗨@Vion。只是想问一下你是否找到解决方案了?我现在面临几乎相同的问题... - Alex
是的,我找到了解决方案(请参见下文) - Vion
2个回答

4

@Alekz:是的,我找到了解决方案。虽然这增加了一些额外负担,但对于我的研究项目来说足够了。

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

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

感谢分享,@Vion! - Alex
我得到的第一个解决方案。但是在某个点上,这难道不变得计算成本太高了吗? - Divij Sehgal
@Vion,你有一些公共代码可以分享吗?这对我来说将是一个很大的帮助。 - hamorillo

0
你可以使用OpenCV中的VideoCapture打开视频文件,然后使用grab获取下一帧。
你需要支持特定的视频编解码器吗? OpenCv grab()文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接