OpenCV:实时过滤多个帧

OpenCV: Filter multiple frames in real time

本文关键字:过滤 实时 OpenCV      更新时间:2023-10-16

我正在尝试通过多个帧过滤同一点。基本上,我想取一个像素(比如在位置(0,0)),并在多个帧的那个位置运行过滤器。

我从网络摄像头上得到一个相框(类型为Mat)。我想缓冲来自相机的大约30帧,并为这30帧制作表示相同位置的向量。例如,如果输入为640x480@30fps。我想要640x480=307200个30点长的矢量。在MATLAB中,这基本上是一个向量矩阵(3D矩阵),其中每个向量有30个元素长。我想要这个,这样我就可以为每个像素应用时间滤波器。

我想我需要制作一个30维的3D垫子(CvMatND)。然后,我将把每个新的帧放入一个新的维度,直到我的矩阵是640x480x30。然后我可以过滤矢量

(0,0,:)

(0,1,:)

(0,2,:)

(640480,:)

一旦我将滤波器应用于每个向量,我将有30帧视频要输出。

我的问题是缓冲30帧的最佳方式是什么?一旦我有了30帧,对每个像素应用滤波器(比如低通滤波器)的最佳方式是什么?

谢谢你的帮助。

这就是我在Åystein W.的帮助下想出的

为新帧创建一个Mat,为缓冲区创建一个垫子向量:

Mat frame;  // grab the newest frame
std::vector <cv::Mat> buffer;   // buffer for frames

由于我正在从网络摄像头获取帧(最新的帧在"帧"中),我必须在前进之前填充缓冲区:

if (buffer.size() < 30)
{
    buffer.push_back(frame);
    continue;       // goes back to the beginning of the loop, program can't start until the buffer is full
}
else
{
    buffer.erase(buffer.begin());       // this part deletes the first element
    buffer.push_back(frame);            // this part adds the new frame to the end of the vector
}

这应该将最新的帧保持在底部,将最旧的帧保留在顶部。

我正在使用

   std::vector <cv::Mat*> images 

作为缓冲器。通过向量进行迭代很容易,并且可以前后弹出和推送。我对实时处理没有问题。