我正在尝试通过多个帧过滤相同的点。基本上,我想拍摄一个像素(比如位置(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帧,对每个像素应用滤波器(比如低通滤波器)的最佳方法是什么?
感谢您的帮助。
答案 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
作为缓冲区。通过向量迭代很容易,你可以弹出并向后推进。我对实时处理没有任何问题。