C++ OpenCV不是';t在拍摄第一张网络摄像头照片后保存第二张网络摄像头照片

C++ OpenCV不是';t在拍摄第一张网络摄像头照片后保存第二张网络摄像头照片,c++,opencv,video-capture,C++,Opencv,Video Capture,我正试图用网络摄像头连续快速拍摄两张照片。以下是我为此编写的代码: #include <opencv/cv.h> #include <opencv/highgui.h> #include <iostream> #include <Windows.h> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat frame; Vide

我正试图用网络摄像头连续快速拍摄两张照片。以下是我为此编写的代码:

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
#include <Windows.h>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat frame;
    VideoCapture cap(0);

    if (!cap.isOpened()) cout << "it ain't open.\n";

    cap.set(CV_CAP_PROP_FRAME_WIDTH,  300);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 300);
    namedWindow("1", CV_WINDOW_AUTOSIZE);

    printf("before\n");
    cout << "read 1 status: " << cap.read(frame) << endl;
    imshow("1", frame);
    while (1){
        if (waitKey(27) >= 0){
            destroyAllWindows();
            break;
        }
    }

    printf("after 1\n");

    Mat frame2;
    namedWindow("2", CV_WINDOW_AUTOSIZE);
    cout << "read 2 status: " << cap.read(frame2) << endl;
    imshow("2", frame2);
    while (1){
        if (waitKey(27) >= 0){
            destroyAllWindows();
            break;
        }
    }

    printf("after 2\n");

    getchar();

    return 0;
}
知道我错过了什么吗

编辑:Marol提供了这个问题的答案。拍摄第二帧时,我拍摄了两张照片,并将它们保存到同一张垫子上:

Mat frame2;
namedWindow("2", CV_WINDOW_AUTOSIZE);
cout << "read 2 status: " << cap.read(frame2) << endl;
cout << "read 3 status: " << cap.read(frame2) << endl;
imshow("2", frame2); 
matframe2;
namedWindow(“2”,CV\u窗口\u自动调整大小);

cout它确实返回两个不同的图片。试着在拍摄第一张照片的瞬间快速移动。您可以看到frame1与frame2不同,尽管实际上frame2来自您期望的不同时间。对于我的简单网络摄像头,它会在一个时间点缓冲两帧(我指的是一帧和第一帧之后的第二帧)


解决方案是丢弃偶数的帧(第二、第四等),只考虑奇数(第一、第三等)。

我会去,相反,如果第二次捕获(不管什么原因)都会失败,则操作符>不会返回错误代码,而读()会做出您建议的更改——似乎没有返回任何错误代码。AFAIK一些相机(或驱动程序)有一个帧缓冲区,这意味着您可能会从同一帧缓冲区获得两帧。你有没有试过丢弃一些东西,比如说,10帧,然后再抓取下一帧?这就解决了!非常感谢。
Mat frame2;
namedWindow("2", CV_WINDOW_AUTOSIZE);
cout << "read 2 status: " << cap.read(frame2) << endl;
cout << "read 3 status: " << cap.read(frame2) << endl;
imshow("2", frame2);