3

我需要从存储在我的 Android 设备(在本例中是我的模拟器)的 sd 卡中的视频中逐帧捕获。我正在通过 NDK 使用 Android 和 OpenCV。我通过 DDBS (eclipse) 的文件资源管理器手动推送了 sdcard 中的文件“SinglePerson.avi”,并使用以下代码读取文件:

    JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4Mixed_VideoProcessing(JNIEnv*, jobject)
{
    LOGI("INSIDE VideoProcessing ");

    CvCapture* capture = cvCaptureFromAVI("/mnt/sdcard/SinglePerson.avi");

    IplImage* img = 0;

    if(!cvGrabFrame(capture)){              // capture a frame
        LOGI("Inside the if");
        printf("Could not grab a frame\n\7");
        exit(0);
    }
    img=cvRetrieveFrame(capture);// retrieve the captured frame
    cvReleaseCapture(&capture);

}

问题是 cvGrabFrame(capture) 结果总是错误的。有什么建议可以正确打开视频并抓取帧吗?提前致谢

4

2 回答 2

0

某些版本的 OpenCV(在 opencv2 包中)构建时不支持视频。如果是您的情况,您必须在 pkg 的 Makefile 中启用“-D WITH_FFMPEG=ON”并重新编译。

“Displaying AVI Video using OpenCV”教程:

“您可能需要确保已成功安装 ffmpeg 以允许以不同格式进行视频编码和视频解码。没有 ffmpeg 功能可能会在尝试运行此简单示例并产生编译错误时导致问题”。

还要检查 cvCaptureFromAVI 中的路径是否正确。

希望这会有所帮助!

于 2013-01-24T12:34:33.997 回答
0

您观察到的行为可能是由于cvCaptureFromAVI()失败。您需要安全地开始编码并检查您所做的调用的返回:

CvCapture* capture = cvCaptureFromAVI("/mnt/sdcard/SinglePerson.avi");
if (!capture)
{
    printf("!!! Failed to open video\n\7");
    exit(0);
}

此功能通常失败有两个原因:

  • 当它无法访问文件时(由于错误的文件系统权限);
  • 系统上缺少编解码器(或 OpenCV 不支持视频格式)。

如果您是 OpenCV 新手,我建议您先在桌面 (PC) 上测试您的 OpenCV 代码。

于 2013-01-24T15:52:50.863 回答