线性全景图OpenCV的SURF特征检测

时间:2013-04-12 05:11:12

标签: opencv video-processing panoramas

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

我将遵循的步骤是:

  1. 从视频中捕获帧
  2. 特征检测 - (SURF)
  3. 功能跟踪(Kanade-Lucas-Tomasi)
  4. Homography估算
  5. 拼接马赛克。
  6. 到目前为止,我已经能够保存视频中的单个帧并仅在两个图像上完成SURF特征检测。我不是要求有人来解决我的整个项目,但是我很难尝试在捕获的剩余帧上完成SURF检测。

    问题:如何将SURF检测应用于连续帧?我将它保存为YAML或xml吗?

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

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

1 个答案:

答案 0 :(得分:1)

在处理类似的项目时,我创建了std::vector个SURF关键点(包括点和描述符),然后使用它们来计算成对匹配。 在逐帧阅读电影时填充向量,但它与图像序列的作用相同。

没有足够的点来使你的记忆饱和(并使用yml / xml文件),除非你的资源非常有限或者序列很长。

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

读取矢量

首先声明Mat的向量,例如std::vector<cv::Mat> my_sequence;。 然后,您有两个选择:

  1. 要么您知道帧数,那么您将向量调整到正确的大小。然后,对于每个帧,使用my_sequence.at(i) = frame.clone();frame.copyTo(my_sequence.at(i));

  2. 将图像读取到某个变量并将其复制到序列中的正确位置
  3. 或者您事先不知道尺寸,只需像往常一样调用push_back()方法:my_sequence.push_back(frame);