【问题标题】:Reading a video frame by frame with Android OpenCv使用 Android OpenCv 逐帧读取视频
【发布时间】:2013-11-08 03:54:05
【问题描述】:

我有一组视频存储在 android 文件系统的一个文件夹中。 我想逐帧读取每一帧,以便我可以对它们执行一些 OpenCv 函数,然后将它们显示在位图中。 我不确定如何正确执行此操作,我们将不胜感激。

【问题讨论】:

    标签: android opencv video


    【解决方案1】:

    我不了解 Android,但通常您必须使用 VideoCapture::open 打开视频,然后使用 VideoCapture::grab 获取下一帧。有关更多信息,请参阅 OpenCV 的 Documentation

    更新

    目前Android似乎不支持相机访问,请在OpenCV Github上查看此问题:https://github.com/opencv/opencv/issues/11952

    您可以尝试问题中链接的非官方分支:https://github.com/komakai/opencv/tree/android-ndk-camera

    或使用另一个库读取帧,然后从数据缓冲区中创建 OpenCV 图像,如 question

    【讨论】:

    • VideoCapture.open 在 android 中总是给出 false,这意味着它无法打开任何文件或相机进行阅读。
    • @DivijSehgal 你能解释一下你的评论吗?这是一个错误还是 VideoCapture.open 的行为发生了变化?还是你有问题?如果后者请提出新问题,请参阅:How to Ask
    • 从我现在看到的情况来看,VideoCapture.open 的行为与您编写此答案时的行为有所不同。虽然这在几年前可能有效,但现在无效。
    • 你有这方面的资料吗?如果我在 Github 上查看源 code,我找不到任何证据表明行为已经改变。
    • 好吧,我发现了一些东西:github.com/opencv/opencv/issues/11952 看来你是对的.. Android 官方不支持它。在链接的问题中,您可以找到 readds 支持的 OpenCV 分支。
    【解决方案2】:

    我知道已经很晚了,但任何人都可以在需要时使用它 因此您可以使用@Pawan Kumar 代码,并且您需要将读取权限添加到您的清单文件<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    你会得到它的工作。

    【讨论】:

      【解决方案3】:

      你可以看看Javacv

      “JavaCV首先为计算机视觉领域研究人员常用的库提供了封装:OpenCV、FFmpeg、libdc1394、PGR FlyCapture、OpenKinect、videoInput和ARToolKitPlus”

      要逐帧阅读,您必须执行以下操作

      FrameGrabber videoGrabber = new FFmpegFrameGrabber(videoFilePath);
      
      try 
      {
          videoGrabber.setFormat("video format goes here");//mp4 for example
          videoGrabber.start();    
      } catch (com.googlecode.javacv.FrameGrabber.Exception e) 
      {           
          Log.e("javacv", "Failed to start grabber" + e);     
          return -1;  
      }
      
      Frame vFrame = null;
      
      do
      {
          try
          {
              vFrame = videoGrabber.grabFrame();
              if(vFrame != null)
                  //do your magic here
          } catch (com.googlecode.javacv.FrameGrabber.Exception e) 
          {
              Log.e("javacv", "video grabFrame failed: "+ e);
          }
      }while(vFrame != null);
      
      try 
      {
          videoGrabber.stop();
      }catch (com.googlecode.javacv.FrameGrabber.Exception e) 
      {
          Log.e("javacv", "failed to stop video grabber", e);
          return -1;
      }
      

      希望对您有所帮助。祝你好运

      【讨论】:

      • 请帮助我。从视频中获取所有帧
      • 我在videoGrabber.start(); 上收到以下错误:javacv(1999): Failed to start grabberorg.bytedeco.javacv.FrameGrabber$Exception: avformat_open_input() error -2: Could not open input "/Users/pchandak/Desktop/adt-bundle-mac-x86_64-20140702/set2_half1_video_2_50_to_3_11_te.mp4". (Has setFormat() been called?)。我在 Mac 和 windows 上都试过了,但是没用。
      • @ParagS.Chandakkar 很确定它与您运行的操作系统无关。就像错误日志中说的 (Has setFormat() been called?) 一样,是否调用了 setFormat?
      • @PawanKumar 是的。我实际上发现它甚至无法获取文件的地址。所以我认为错误与视频阅读无关,它无法找到视频本身。我可以在我的 android 设备上看到该文件,但如果我给出相同的路径,我的设备将无法读取。所以我现在正在努力解决这个问题。
      猜你喜欢
      • 2018-01-27
      • 2015-08-28
      • 2019-12-31
      • 2017-01-11
      • 2014-08-24
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多