0

这些是我希望这个项目使用 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;
}

但是,当我运行它时,我在两个窗口中都得到了相同的图像。谁能解释为什么会这样?我该怎么做才能让它按照我解释的方式工作?

4

3 回答 3

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);
于 2013-06-17T15:34:15.590 回答
0

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

于 2013-06-16T18:10:27.830 回答
0

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

于 2013-06-16T19:03:36.223 回答