2

我已经开始了一个使用视频创建长场景的线性/条形全景图的项目。这意味着全景图不围绕中心旋转,而是平行于场景移动,例如。安装在车辆上的视频摄像头垂直于街道立面。

我将遵循的步骤是:

  1. 从视频中捕获帧
  2. 特征检测 - (SURF)
  3. 特征跟踪 (Kanade-Lucas-Tomasi)
  4. 单应性估计
  5. 拼接马赛克。

到目前为止,我已经能够从视频中保存单个帧并仅在两张图像上完成 SURF 特征检测。我不是要求有人解决我的整个项目,但我一直在尝试完成对捕获的剩余帧的 SURF 检测。

问题:如何将 SURF 检测应用于连续帧?我将其保存为 YAML 还是 xml?

对于我的特征检测,我使用了 OpenCV 的示例 find_obj.cpp 并只是更改了使用的图像。

有没有人经历过这样的项目?我想实现的一个例子是来自 Iwane 技术http://www.iwane.com/en/2dpcci.php

4

1 回答 1

1

在从事类似项目时,我创建了一个std::vectorSURF 关键点(点和描述符),然后使用它们来计算成对匹配。该向量在逐帧阅读电影时被填充,但它对一系列图像的工作方式相同。

除非您的资源非常有限或序列非常长,否则没有足够的点来饱和您的内存(并使用 yml/xml 文件)。

请注意,您不需要特征跟踪部分,至少在大多数标准情况下:SURF 描述符匹配还可以为您提供单应性估计(无需跟踪)。

读取向量

首先声明一个 Mat 的向量,例如std::vector<cv::Mat> my_sequence;。那么,你有两个选择:

  1. 要么您知道帧数,然后将矢量调整为正确的大小。然后,对于每一帧,将图像读取到某个变量并将其复制到序列中的正确位置,使用my_sequence.at(i) = frame.clone();frame.copyTo(my_sequence.at(i));

  2. 或者您事先不知道大小,您只需push_back()照常调用该方法:my_sequence.push_back(frame);

于 2013-04-12T07:01:31.720 回答