How to get newest VideoCapture frame

asked 2016-10-28 07:55:05 -0600

updated 2016-10-28 08:42:08 -0600

berak gravatar image

Hello, I'm trying to load the very newest frame from a usb webcam; the following code works well enough using v3.1.0 via Codeblocks on Windows 7, I get a 1 sec delay between frame1 and frame2, and 2sec delay between frame2 and frame3, not exactly how the program reads. Problem is when I copy it onto a Pi3, using v2.4.13, Rasbian, the delay is ignored completely (or interrupted ??). I've tried using sleep() with unistd.h; I get a total delay of 6 seconds, but the cap.read() statements return consecutive frames about .04secs apart and not the 1, 2 or 3 second delay I want, because it's retrieving old frames in the buffer I assume. So how can I always get the very newest frame from VideoCapture? Any help would be great, I'm new to C++ and OpenCV. Thanks

 #include <opencv/cv.hpp>
 #include <iostream>
 #include <time.h>
using namespace cv;
using namespace std;

void delay(unsigned int mseconds){
    clock_t goal = mseconds + clock();
    while (goal> clock());
    }

Mat frame1, frame2, frame3;
VideoCapture cap(0);

int main(){
    delay(1000);
    cap.read(frame1);
    delay(2000);
    cap.read(frame2);
    delay(3000);
    cap.read(frame3);
    imshow("1",frame1);
    imshow("2",frame2);
    imshow("3",frame3);
    waitKey(0);
    return 0;
}
edit retag flag offensive close merge delete

Comments

clock return number of ticks not number of millisecond. You should use ((float)clock()*1000.0)/CLOCKS_PER_SEC+mseconds

You can use OpenCV function too GetTickCount

example is given in getTickfrequency

LBerger gravatar imageLBerger ( 2016-10-28 10:30:48 -0600 )edit