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

在Android上的OpenCV中逐帧处理视频,android,opencv,video,Android,Opencv,Video,我的目标如下: 我必须读入存储在sd卡上的视频,逐帧处理,然后再次将其存储在sd卡上的新文件中。问题在于OpenCV4Android没有视频编码器/解码器,因为它不包含ffmpeg。此外,使用JavaCV处理图像对我来说是没有选择的,因为代码已经用原生OpenCV编写,我通过JNI访问它们。我在这里读了很多关于stackoverflow和Google的其他内容。但我没有找到解决办法 JavaCV允许我逐帧读取视频,也可以逐帧存储。但是,我无法将视频转换为普通的OpenCV Mat对象,这些对象可

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

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

  • 我读过关于JCodec作为视频编码/解码库的文章。JCodec会允许我完成我的任务吗?如果是,你知道任何例子吗

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

  • 从API 18开始,Android中有MediaCodec和MediaMuxer。也许他们能帮助我

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

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

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


    希望我能解释一切。

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

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


    是的,我找到了一个解决办法。即使是额外的开销,对我的研究项目来说也足够了

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

  • 使用FrameGrabber从视频中抓取三通道IplImage帧
  • 将三通道帧转换为四通道IplImage帧
  • 将四通道帧转换为Android位图图像
  • 将Android位图图像转换为OpenCV Mat帧
  • 加工OpenCV垫架
  • 将处理后的Mat帧转换为Android位图图像
  • 将Android位图图像转换为四通道IplImage帧
  • 将四通道IplImage帧转换为三通道IplImage
  • 使用FrameRecorder将三通道IplImage作为帧存储在视频中

  • 嗨,维翁。我只是想问你是否找到了解决办法?我现在面临着几乎相同的问题…是的,我找到了解决方案(见下文)。谢谢分享,@Vion!我得到的第一个解决方案。但这在某种程度上不是太昂贵了吗?@Vion您的解决方案中有一些公共代码吗?这对我将是一个很大的帮助。