我正在尝试通过多个帧过滤同一点。基本上,我想取一个像素(比如在位置(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
作为缓冲器。通过向量进行迭代很容易,并且可以前后弹出和推送。我对实时处理没有问题。