opencv - 使用 SIFT/SURF 的特征匹配可以用于相似对象的分类吗?

标签 opencv image-processing feature-detection sift

我已经在 OpenCV 中实现了 SIFT 算法,使用以下步骤进行特征检测和匹配:

  1. 使用 Otsu 的阈值去除背景
  2. 使用 SIFT 特征检测器进行特征检测
  3. 使用 SIFT 特征提取器提取描述符
  4. 使用 BFMatcher(L2 Norm) 匹配特征向量并使用比率测试进行过滤 好匹配

我的目标是根据图像的相似性将图像分类为不同的类别,例如鞋子、衬衫等。例如,两个不同的高跟鞋应该比高跟鞋和运动鞋或高跟鞋和 T 恤更相似。

但是,只有当我的模板图像出现在搜索图像中(以任何比例和方向)时,此算法才能正常工作。如果我比较两个不同的高跟鞋,它们不会很好地匹配并且匹配也是随机的(一个图像的鞋跟与另一个图像的平面匹配)。当我将高跟鞋与运动鞋、高跟鞋与 T 恤或高跟鞋与婴儿图片进行比较时,也有很多误报!

我想看一个鞋跟并将其识别为鞋跟,然后返回鞋跟与我数据库中不同图像的相似程度,为其他鞋跟提供最大相似度,然后是其他鞋子。它不应与衬衫、电话、钢笔等不相关的物体产生任何相似性。

我知道 SIFT 算法根据关键点周围像素的梯度值为每个关键点生成一个描述符向量,并且图像完全使用此属性进行匹配。因此,很有可能位于一只鞋后跟附近的关键点与另一只鞋表面的关键点相匹配。因此,我收集到的是,该算法只能用于检测精确匹配,而不能检测图像之间的相似性

能否请您告诉我这个算法是否可以用于我的目标,如果我做错了什么或建议我应该使用的任何其他方法。

最佳答案

对于相似对象的分类,我当然会选择级联分类器。

基本上,级联分类器是一种机器学习方法,您可以在其中训练分类器来检测不同图像中的对象。为了使其正常工作,您需要使用大量正面(目标所在的位置)和负面(目标不存在的位置)图像来训练分类器。该方法由 Viola 和 Jones 于 2001 年发明。

OpenCV 中有一个现成的人脸检测实现,您将在 openCV 文档中获得更多解释(抱歉,无法发布链接,我目前仅限于 1 个链接..)

现在,注意事项:

  • 首先,您需要大量正面和负面图像。您拥有的图像越多,算法的性能就越好。谨防过度学习:例如,如果您的高跟鞋训练数据集包含给定模型的太多图像,则可能无法正确检测到其他模型

  • 训练级联分类器可能既漫长又困难。最终结果将取决于您为训练分类器选择的参数有多好。可以在此网页上找到有关此的一些信息:http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html

关于opencv - 使用 SIFT/SURF 的特征匹配可以用于相似对象的分类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24032976/

相关文章:

c++ - 在 OpenCV 上使用 GPU 时如何确定线程数?

java - 当类在 main() 之外实例化时,GUI 无响应

android - 连接来自 Canny 算法的线

android - 具有拉伸(stretch)比例和扭曲效果的android中的图像处理

opencv - C 中的 SIFT 特征检测

opencv - 如何在opencv中使用GenericIndex类

ruby - 功能标志最佳实践 : condition inside or outside of a method?

c++ - 校准期间 OpencV 错误

c++ - Linux 摄像头默认到/dev/video10?

php - 使用 X/Gui-less linux 生成网页的图像/缩略图