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

Capture 2 non-consecutive frames using a webcam in OpenCV

本文关键字:2个 连续 摄像头 OpenCV 网络      更新时间:2023-10-16

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

然而,当我运行这个时,我在两个窗口中得到相同的图像。有人能解释一下为什么会这样吗?我怎么做才能使它像我解释的那样起作用?

如果您在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);

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

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