首页 文章

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

提问于
浏览
7

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

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

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

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

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

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

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

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

希望,我解释了一切 .

2 回答

  • 2

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

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

    • 使用FrameGrabber从视频中抓取三个通道的IplImage帧

    • 将抓取的三通道帧转换为四通道IplImage帧

    • 将四通道帧转换为Android位图图像

    • 将Android Bitmap图像转换为OpenCV Mat框架

    • 处理OpenCV Mat框架

    • 将已处理的Mat帧转换为Android Bitmap图像

    • 将Android位图图像转换为四通道IplImage帧

    • 将四通道IplImage帧转换为三通道IplImage

    • 使用FrameRecorder将三个通道IplImage存储为视频中的帧

  • 0

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

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

    OpenCv grab() documentation

相关问题