使用OpenCV中的网络摄像头捕获2个非连续帧

时间:2013-06-16 17:49:38

标签: c++ opencv video webcam video-capture

这些是我希望此项目使用OpenCV遵循的步骤:

1)按1键时拍摄一帧。

2)移动网络摄像头

3)按下2键时拍摄第二帧。

4)显示两个图像。

以下是我正在使用的代码:

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

然而,当我运行这个时,我在两个窗口中都得到了相同的图像。任何人都可以解释为什么会这样吗?我能做些什么让它按照我解释的方式工作?

3 个答案:

答案 0 :(得分:1)

如果你正在使用linux,那么你必须从捕获设备中清空缓冲区。我通过运行一个单独的线程来读取帧并只记住最后一个帧。当我想要一个框架进行进一步处理时,我克隆一个现在被记住的那个。但是,在你的情况下,它可能会有点矫枉过正。

此外,您可能希望执行类似此操作而不是当前的主循环:

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

答案 1 :(得分:0)

您需要将cap()调用放在循环中 - 否则您只需执行一次捕获

答案 2 :(得分:0)

我没有使用cap >> img1cap >> img2,而是添加了一个名为“captura”的Mat变量来存储当前帧,并分别使用了img1 = captura.clone()img2 = captura.clone(),现在它正在运行。