由于捕获缓冲区导致VideoCapture opencv出现延迟

时间:2015-10-24 09:06:37

标签: c++ c multithreading opencv lag

我使用相机继续获取帧。在我的代码中,我使用VideoCapture来做到这一点。但是当我调试时,我发现我得到的帧是旧帧。我问了一些人,他们告诉我,一些旧的框架将存储在缓冲区中,我应该使用工作线程来获取最新的框架。此处也有类似的问题。

Similar question

在这里,我有两个问题,

如果缓冲区可以存储5帧并且现在已经存储了5帧,那么缓冲区何时更新?已经取出5帧或只有1帧?因为我想知道我是否一直都有旧框架,或者我有一个新框架然后四个旧框架然后改为一个最新框架......

我已调试我的代码,在cap>>处设置断点帧。第一帧(循环)把我的手放进去,第二个循环把我的手伸出相机,我发现图像会在几帧后改变。这是否意味着我有一个新的帧然后四个旧帧然后改为一个最新的帧...?

2.因为这是我第一次使用线程,我不确定我的代码是否错误,这是我的代码,

void task(VideoCapture cap, Mat& frame) {
    while (true) {
        cap.grab();
    }
}

int main() {
    Mat frame, image;
    VideoCapture cap;
    cap.open(0);
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1600);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
    cap.grab();
    thread t(task, cap, frame);
    while (true) {
        cap.retrieve(frame);
        frame.copyTo(image);
        ...//image processing loop
    }
}

我还在task()中设置断点来检查帧,但条件相同。几帧之后图像会发生变化。我不知道为什么。我的代码是错误的还是我不能设置断点来检查这样使用线程?有人可以帮忙吗?非常感谢你。

0 个答案:

没有答案