【发布时间】:2013-11-08 03:54:05
【问题描述】:
我有一组视频存储在 android 文件系统的一个文件夹中。 我想逐帧读取每一帧,以便我可以对它们执行一些 OpenCv 函数,然后将它们显示在位图中。 我不确定如何正确执行此操作,我们将不胜感激。
【问题讨论】:
我有一组视频存储在 android 文件系统的一个文件夹中。 我想逐帧读取每一帧,以便我可以对它们执行一些 OpenCv 函数,然后将它们显示在位图中。 我不确定如何正确执行此操作,我们将不胜感激。
【问题讨论】:
我不了解 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 的行为发生了变化?还是你有问题?如果后者请提出新问题,请参阅:How to Ask
VideoCapture.open 的行为与您编写此答案时的行为有所不同。虽然这在几年前可能有效,但现在无效。
我知道已经很晚了,但任何人都可以在需要时使用它
因此您可以使用@Pawan Kumar 代码,并且您需要将读取权限添加到您的清单文件<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
你会得到它的工作。
【讨论】:
你可以看看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 上都试过了,但是没用。
(Has setFormat() been called?) 一样,是否调用了 setFormat?