如何比较两个图像并检查两个图像是否在OpenCV python或JavaCV中具有相同的对象

时间:2014-10-16 05:35:28

标签: image python-2.7 opencv javacv feature-detection

我正在开发一个功能匹配项目,我正在使用OpenCV Python作为开发应用程序的工具。

根据项目要求,我的数据库有一些像玻璃,球等物体的图像及其描述。用户可以将图像发送到应用程序的后端,后端负责将发送的图像与数据库中存在的图像进行匹配,并将图像描述发送给用户。

我对上述情况进行了一些研究。不幸的是,我仍然找不到匹配两个图像的算法,并且识别它们是否匹配。

如果有任何身体有这种算法请发给我。(我必须使用OpenCV python或JavaCV)

谢谢

2 个答案:

答案 0 :(得分:4)

这是目前计算机视觉中一个非常普遍的问题。一个简单的解决方案非常简单。但是,对于更复杂的解决方案,有许多变种。

简单解决方案

  1. 基于特征检测器和描述符。 这里的想法是你获得了一堆关键点及其描述符(搜索SIFT / SURF / ORB)。然后,您可以使用OpenCV中提供的工具轻松找到匹配项。您可以将查询图像中的关键点与训练数据集中的所有关键点进行匹配。由于典型的异常值,您希望添加一个强大的匹配技术,如RanSaC。所有这些都是OpenCV的一部分。
  2. Bag-of-Word模型 如果您只想要与查询图像完全相同的图像,则可以使用最近邻搜索。请注意,OpenCV具有更快的近似 - 最近邻(ANN)算法。或者您可以使用BruteForceMatcher。
  3. 高级解决方案

    如果您有许多图像(许多= = 1百万),您可以查看Locality-Sensitive-Hashing(参见Dean等人,100,000 Object Categories)。

    如果你使用Bag-of-Visual-Words,那么你应该建立一个倒置索引。

    与BOW相比,请查看Fisher Vectors以提高准确度。

    建议

    首先使用Bag-Of-Visual-Words。有关于如何训练字典的教程 模型。

    培训:

    1. 从训练图像的子集中提取局部特征(只需选择SIFT,您可以轻松地将其更改为OpenCV非常模块化)。首先是detect个功能,然后是extract个功能。网上有很多关于此的教程。
    2. 火车词典。 Helpful documentation引用了Python中的示例实现(opencv_source_code/samples/python2/find_obj.py)!
    3. 计算每个训练图像的直方图。 (也在上一步的BOW文档中)
    4. 将上述步骤中的图像描述符放入FLANN-Based-matcher
    5. 查询:

      1. 计算查询图片的功能。
      2. 使用训练中的字典为查询图像构建BOW直方图。
      3. 使用该功能查找最近的邻居。

答案 1 :(得分:1)

我认为你在谈论基于内容的图像检索

互联网上有很多研究论文。根据你的需要获取它们中的任何一个并实现最佳。根据你的应用选择标准,如基于纹理,基于颜色,基于形状的图像检索(这是最好的你正在互联网上进行图像检索以提高速度。)

所以你需要python实现,我建议你通过本书Computer Vision Book第7章,第8页。它包含工作示例,其中包含您要查找的代码

One question you may found useful : Are there any API's that'll let me search by image?