3

I need to capture frame by frame from a video stored in my sd card of the Android device (in this case my emulator). I am using Android and OpenCV through NDK. I pushed manually the file "SinglePerson.avi" inside the sdcard through file explorer of DDBS (eclipse) and I used the code below to read the file:

    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);

}

The problem is that cvGrabFrame(capture) results always false. Any suggestion to correctly open the video and grab the frames? Thanks in advance

karlphillip
  • 92,053
  • 36
  • 243
  • 426
Mark
  • 346
  • 2
  • 5
  • 18

2 Answers2

0

Some versions of OpenCV (in package opencv2) build without video support. If it is your case you have to enable "-D WITH_FFMPEG=ON" in pkg's Makefile and recompile.

Look at "Displaying AVI Video using OpenCV" tutorial:

"You may need to ensure that ffmpeg has been successfully installed in order to allow video encoding and video decoding in different formats. Not having the ffmpeg functionality may cause problems when trying to run this simple example and produce a compilation errors".

Also check path in cvCaptureFromAVI for correctness.

Hope this will help!

Ann Orlova
  • 1,338
  • 15
  • 24
  • Orlove adding FFmpeg to OpenCV will make it under the GPL license, which is not a good thing if you are planning of putting it in a commercial app – Nativ Nov 10 '13 at 18:02
0

The behavior you are observing is probably due to cvCaptureFromAVI() failing. You need to start coding safely and check the return of the calls you make:

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

This function usually fails for 2 reasons:

  • When it's unable to access the file (due to wrong filesystem permissions);
  • Missing codecs on the system (or the video format is not supported by OpenCV).

If you are new to OpenCV, I suggest you test your OpenCV code on a desktop (PC) first.

karlphillip
  • 92,053
  • 36
  • 243
  • 426