OpenCV上的视频捕获自动更新帧

OpenCV上的视频捕获自动更新帧,opencv,video-capture,video-processing,Opencv,Video Capture,Video Processing,我正在实现一个算法,该算法需要来自瞬间t的一个视频帧和来自瞬间t+1的另一个视频帧。从几个例子来看,这似乎非常简单。我认为这将非常有效: VideoCapture cap(0); Mat img1, img2; while(1) { cap >> img1; // instant t cap >> img2; // instant t+1 imshow(img1 == img2); } 但事实并非如此,图像是相同的,因为显示的图像(img1==i

我正在实现一个算法,该算法需要来自瞬间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后显示这两幅图像时,两幅图像都发生了变化!我试过用不同的视频捕捉对象拍摄不同的图像,但没有任何效果

谁能告诉我我做错了什么

谢谢


Renan

我通过将img1和img2复制到辅助矩阵来修复这个问题,这样它们肯定会保持不变。有人知道更好的解决方案吗?

在调用抓取器时(在您的情况下使用
>
操作符),OpenCV只发送对当前帧的引用。因此,img1将指向帧缓冲区,当您调用
cap>>img2
时,两个图像都将指向最新的帧。保存单独图像的唯一方法是将它们存储在单独的矩阵中(即
img1.copyTo(myFirstImg)
myFirstImg=img1.clone()
,等等)。

您可以使用cap.grab()和cap.retrieve(img1,)两次。 请仔细查看位于.grab and retrieve of VideoCapture的文档


grab()函数用于从OpenCV中的摄像机视频中抓取帧

我通过将img1和img2复制到辅助矩阵来修复此问题,这样它们肯定会保持不变。有人知道更好的解决方案吗?