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

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

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

最佳答案

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

关于c++ - 在 OpenCV 中使用网络摄像头捕获 2 个非连续帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17136067/

相关文章:

c++ - 谁能提供 "Skeleton Pruning by Contour Partitioning with Discrete Curve Evolution"算法的简单步骤

flash - 在网站上播放flv

c++ - 在c++中直接使用函数返回值作为引用

c++ - 为什么 GetLocalTime(&sys);显示奇怪的结果?

c++ - 在内存中将 Iplimage 压缩为 jpeg

php - 使用 PHP 从图像创建定格动画视频

video - ffmpeg 将字幕轨道设置为默认值

c++ - 无法从命令行正确获取数据

c++ - 如何typedef一个内部类

python - 想要找到轮廓-> ValueError : not enough values to unpack (expected 3, got 2),出现这个