OpenCV中的VideoCapture如何自动更新帧?

4

我正在实现一个需要从时刻t获取视频帧和另一个从时刻t+1获取的算法。看了一些示例,似乎非常简单。我认为这将完美地工作:

VideoCapture cap(0);
Mat img1, img2;
while(1) {
    cap >> img1; // instant t
    cap >> img2; // instant t+1
    imshow(img1 == img2);
}

但实际上并没有,这些图像是相同的,因为显示的图像(img1 == img2)完全是白色的,每个像素的值都为255。

我想也许是我没有给相机足够的时间去捕捉第二帧,而是使用了仍在缓冲区中的相同帧。我的做法很简单:

VideoCapture cap(0);
Mat img1, img2;
while(1) {
    cap >> img1; // instant t

    // I added 2.5 seconds between the acquisition of each frame
    waitKey(2500); 

    cap >> img2; // instant t+1
    waitKey(2500);
    imshow(img1 == img2);
}

仍然不起作用。为了确保,我添加了以下代码行:

VideoCapture cap(0);
Mat img1, img2;
while(1) {
    cap >> img1; // instant t
    imshow("img1", img1);
    waitKey(2500); // I added 2.5 seconds between the acquisition of each frame

    cap >> img2; // instant t+1

    // Here I display both images after img2 is captured
    imshow("img2", img2);
    imshow("img1", img1);
    waitKey(2500);
    imshow(img1 == img2);
}

当我再次捕获img1后显示这两个图像时,这两个图像都发生了变化!我已尝试使用不同的VideoCapture对象对不同的图像进行捕获,但没有任何效果...有人可以指导我做错了什么吗?
谢谢,
Renan

我通过将img1和img2复制到辅助矩阵中来解决了这个问题,以确保它们始终保持不变。有没有人知道更好的解决方案? - Renan
4个回答

4

当调用抓取器(使用>>运算符时),OpenCV仅发送对当前帧的引用。因此,img1将指向帧缓冲区,当您调用cap >> img2时,两个图像都将指向最新的帧。保持不同图像的唯一方法是将它们存储在不同的矩阵中(例如:img1.copyTo(myFirstImg)myFirstImg = img1.clone()等)。


3

我通过将img1和img2复制到辅助矩阵中来解决了问题,以确保它们保持不变。有没有更好的解决方案?


2
你可以使用cap.grab()和cap.retrieve(img1,)两次操作。 仔细查看VideoCapture的.grab和.retrieve文档。在这里查看链接

1

Captures the frame from system camera using OpenCV

grab()函数用于从OpenCV相机视频中抓取帧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接