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

Vio*_*ion 7 video android opencv

我的目标如下:我必须读取存储在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.也许他们可以帮助我?

所以让我们来看看我的要求.我目前正在定位Android API 19,因此我可以使用我需要的所有功能.对我来说最重要的要求如下:

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

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

希望,我解释了一切.

Vio*_*ion 4

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

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

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