Pedro
Pedro

Reputation: 293

Capture 2 non-consecutive frames using a webcam in OpenCV

These are the steps I want this project to follow using OpenCV:

1) Capture one frame when I press the 1 key.

2) Move the webcam

3) Capture a second frame when I press the 2 key.

4) Show both images.

Here is the code I'm working with:

int main(int, char**){
    VideoCapture cap(1);
    Mat img1, img2;
    int input;
    namedWindow("Imagen 1",CV_WINDOW_AUTOSIZE);
    namedWindow("Imagen 2",CV_WINDOW_AUTOSIZE);

for(;;){
    input = cvWaitKey(40);
    if((char) input ==27)
        break;
    if ((char) input == 49){
        cap >> img1;
        imshow("Imagen 1",img1);
    }
    if ((char) input == 50){
        cap >> img2;
        imshow("Imagen 2",img2);
    }
}
    return 0;
}

However, when I do run this I get the same image in both windows. Can anyone explain why this is happening? What can I do to make it work the way I have explained?

Upvotes: 0

Views: 1093

Answers (3)

morynicz
morynicz

Reputation: 2332

If You are working on linux, then You will have to empty the buffer from capturing device. I do it by running a separate thread that reads the frames and remembers only the last one. When I want to take a frame for further processing, I clone the one which is now remembered. But, in Your case it might be a slight overkill.

Also, You might like to do something like this instead of Your current main loop:

cv::Mat temp,img1,img2;
cv::VideoCapture cap(1);
char control=' ';
cv::namedWindow("current",CV_AUTOSIZE);
cv::namedWindow("img1",CV_AUTOSIZE);
cv::namedWindow("img2",CV_AUTOSIZE);
do{
    if(49 == control){
        img1=temp.clone();
        cv::imshow("img1",img1);
    }else if(50 == control){
        img2=temp.clone();
        cv::imshow("img2",img2);
    }
    cap>>tmp; //emptying buffer all the time
    cv::imshow("current",tmp);
    control=cv::waitKey(40);//if You are faster than captures fps
}while(27 != control);

Upvotes: 1

Pedro
Pedro

Reputation: 293

Instead of using cap >> img1 and cap >> img2I added a Mat variable called "captura" to store the current frame and used img1 = captura.clone() and img2 = captura.clone() respectively and now it's working.

Upvotes: 0

Martin Beckett
Martin Beckett

Reputation: 96109

You need to put the cap() call inside the loop - otherwise you only do one capture

Upvotes: 0

Related Questions