【问题标题】:Is ORB depending on image resolution?ORB 是否取决于图像分辨率?
【发布时间】:2019-03-12 08:36:57
【问题描述】:

我正在尝试使用 OpenCV 从图像中检测和提取 ORB 特征。

但是,我得到的图像没有标准化(不同的尺寸、不同的分辨率等)。

我想知道在提取 ORB 特征之前是否需要对图像进行归一化以便能够在图像之间进行匹配?

我知道特征检测是尺度不变的,但我不确定这对图像分辨率意味着什么(例如,2 个相同大小的图像,1 个物体靠近,另一个物体远离应该会导致匹配,即使它们在图像上具有不同的比例,但如果图像的大小不同怎么办?)。

我是否应该根据图像大小调整 ORB 中的 patchSize(例如,如果我有一个 800px 的图像并采用 20px 的 patchSize,我应该为 400px 的图像采用 10px 的 patchSize 吗?)。

谢谢。

更新: 我用高分辨率和低分辨率图像测试了不同的算法(ORB、SURF 和 SIFT),以了解它们的行为方式。在这张图片中,物体大小相同,但图像分辨率不同:

我们可以看到 SIFT 非常稳定,尽管它的功能很少。 SURF 在关键点和特征尺度方面也相当稳定。所以我的猜测是,使用 SIFT 和 SURF 在低分辨率和高分辨率图像之间进行特征匹配是可行的,但 ORB 在低分辨率中具有更大的特征,因此描述符不会匹配高分辨率图像中的那些。

(在高分辨率和低分辨率特征提取之间使用了相同的参数)。

所以我的猜测是,如果我们想在不同分辨率的图像之间进行匹配,SIFT 或 SURF 会更好。

【问题讨论】:

  • 虽然 ORB 是“尺度不变的”,但它不像 ORB 研究论文中提到的 SURF/SIFT 那样健壮。您将在具有不同分辨率的图像上获得不同的匹配(数量/位置/方向),因此使用补丁大小可能会起作用
  • 是的。我尝试使用 SIFT/SURF,但不幸的是,它们已获得专利,所以 OpenCV 向我抛出一个错误,说我应该使用 OPENCV_USE_NONFREE 重新编译它,但是当我使用 pip 安装它时,我无法重新编译它。
  • 嗯,你也可以得到这些,见this link
  • 是的。不幸的是,这需要我编译 OpenCV,这是我试图避免的。但我想我真的别无选择。
  • 是否有 SURF 或 SIFT 的 OpenCV 示例代码?

标签: opencv sift surf orb


【解决方案1】:

根据OpenCV documentation,ORB 也使用金字塔来产生多尺度特征。尽管此页面上的详细信息尚不清楚。
如果我们查看ORB paper itself,在第 6.1 节中提到使用了具有五种不同比例的图像。但是我们仍然不确定您是否需要手动计算不同比例的图像上的描述符,或者它已经在 OpenCV ORB 中实现。
最后,from source code(我写这个答案时的第 1063 行)我们看到为关键点/描述符提取计算了具有不同分辨率的图像。如果您跟踪变量,您会看到 ORB 类有一个比例因子,您可以使用getScaleFactor 方法访问它。

简而言之,ORB 尝试自己在不同的尺度上执行匹配。

【讨论】:

  • 我认为您所指的比例因子是图像在高斯金字塔中的比例除以比例。但如果我用 1600x1600px 和 800x800px 拍摄相同的图像,我认为我不会获得相同的功能。
  • 这就是我说“尝试执行”的原因。根据您的分辨率,您当然会得到不同的关键点。您调整图像大小的方法也是一个重要因素(线性、双三次等)。如果您遵循源代码中的变量,您会看到其中提到的比例用于调整图像大小,它会调用 getScale 函数,该函数取决于比例因子。
猜你喜欢
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
相关资源
最近更新 更多