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

标签 android opencv video

我的目标如下: 我必须读取存储在 SD 卡上的视频,逐帧处理它,然后再次将其存储在 SD 卡上的新文件中。问题是 OpenCV4Android 没有视频编码器/解码器,因为它不包含 ffmpeg。此外,使用 JavaCV 处理图像对我来说不是一个选择,因为代码已经用原生 OpenCV 编写并且我通过 JNI 访问它们。我在这里阅读了大量有关 stackoverflow 和 Google 其他内容的文章。但我没有找到解决办法。

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

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

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

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

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

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

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

希望我解释了一切。

最佳答案

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

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

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

关于android - 在 Android 上的 OpenCV 中逐帧处理视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24199291/

相关文章:

video - Youtube Direct Lite或其他解决方案

android - 禁用 MapView 离散缩放,更改为连续缩放

android - 每两分钟更改 Android Wear 表盘的背景

java - 在使用 java 的 ARCore 中,如何在我的世界中绘制 3D 三角形/线

opencv - 如何 “translate”摄像机到图像的运动?

opencv - matchShapes 使用灰度图像 opencv

python - 无法在 matplotlib 中显示正常图像,它一直使用 jet colormap 显示

iphone - UIImagePickerController 横向录制视频

android - 将Gradle Nature添加到Eclipse上的现有android项目

javascript - IE9 HTML5 视频 "play"事件在第二次播放时未触发