OpenCV:实时过滤多个帧

时间:2014-04-19 00:23:12

标签: c++ opencv filter

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

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

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

(0,0,:)

(0,1,:)

(0,2,:)

...

(640,480,:)

一旦我将滤镜应用到每个矢量,我将有30帧视频输出。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

这是我提出的ØysteinW。的帮助

为新框架创建一个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
}

这应该保持最新的框架在底部,最旧的框架在顶部。

答案 1 :(得分:-1)

我正在使用

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

作为缓冲区。通过向量迭代很容易,你可以弹出并向后推进。我对实时处理没有任何问题。