如何使用 Emgu CV 的 Surf 库来匹配图像库
Emgu CV 的示例集有一个示例,介绍如何使用 SURFDetector 从特征中检测特征,然后使用 Features2DTracker 的 MatchFeature 调用(似乎使用 KNN)将“模型”图像与“观察到”图像进行匹配。这部分是有道理的。
现在,如果我想构建一个图像库,每个图像都使用图像的 SURF 功能来查找给定图像的最佳匹配,我有哪些选择?我可以构建一棵树,而不是对库中的每个图像进行强力匹配吗?我很困惑,因为 Emgu 似乎正在构建某种树,但仅限于两个图像之间:
//Create a SURF Tracker using k-d Tree
SURFTracker tracker = new SURFTracker(modelFeatures);
我几乎阅读了网站上有关该主题的所有线程,但不明白如何开始。我还考虑使用直方图匹配——将每个 RGB 通道分成容器并比较标准化计数。如果我想根据 RGB 计数来划分搜索空间,而不是计算到库中每个图像的欧几里德距离,那仍然意味着在 R、G、B 之一上进行分支——而且我不知道如何构建那个决策树。
我几天前才开始阅读这个主题,所以为我的天真道歉。
Emgu CV's Example set has an example on how to use SURFDetector to detect features from a feature and then use Features2DTracker's MatchFeature call (which seems to use KNN) to match a "model" image to an "observed" image. This part makes sense.
Now, if I wanted to build a library of images, each using image's SURF features to find the best match for a given image, what are my options? Instead of doing a brute force match with each image in my library, can I build a tree? I'm confused because Emgu seems to be building some sort of tree, but only between two images:
//Create a SURF Tracker using k-d Tree
SURFTracker tracker = new SURFTracker(modelFeatures);
I've read almost every thread on the site on the subject but can't understand how to get started. I also though about using histogram matching -- splitting each RGB channel into bins and comparing the normalized count. Instead of calculating the euclidean distance to each image in the library, if I wanted to partition my search space based on RGB count, that would still mean branching on one of R,G,B -- and I'm not sure how to build that decision tree.
I only started reading about this topic a few days ago, so apologies for my naivety.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你可以看看 EMGU CV 的 TrafficSignRecognition。它与 SURFFeature 示例相同,但应用于现实生活。它能够检测给定的图像是否与给定的图像匹配以及有多少个。我试过了。你可以看一下。
You could take a lookat EMGU CV's TrafficSignRecognition. It is the same as the SURFFeature example, but applied in real life. It is able to detect whether the given image matches with the image given and how many there are. I tried it. You can take a look at it.
SURFTracker 似乎使用了 OpenCV 附带的 FLANN(近似最近邻的快速库)库(也有 Emgu 绑定),同时它:
假设您希望比简单地对每个图像执行上述过程更快,您必须为每个图像的每个描述符构建一个树,并将其放入 FLANN 索引中,同时跟踪哪个描述符来自哪个图像(可能在一个单独的数组中)。
当给定图像时,您可以从中提取所有描述符,并将它们一一匹配到 FLANN 树(这比为每个模板描述符集合使用不同的树更快)。因此,对于样本中的每个描述符 X,您都会获得来自图像 Z 的最相似的描述符 Y。这些可以用作对相似图像的投票(请参阅 http://en.wikipedia.org/wiki/Bag_of_words_model)。
然而,这种方法没有考虑点的空间一致性......但也可以检查一下,对于我们投票的前 k 个图像(k << N,所有图像的数量系统中)。
SURFTracker seems to use the FLANN (Fast Library for Approximate Nearest Neighbors) library that comes with OpenCV (so has Emgu bindings, too) while it:
Supposing you'd like to be faster than simply doing the above procedure for every image, you would have to build one tree out of every descriptor for every image, and put that into a FLANN Index while keeping track of which descriptor came from which image (probably in a separate array).
When given an image, you could extract all the descriptors from it, and match them one by one to the FLANN tree (this is faster than doing it with a different tree for every template descriptor collection). So for every descriptor X in the sample, you get a most similar descriptor Y that comes from image Z. These can be used as votes for similar images (see http://en.wikipedia.org/wiki/Bag_of_words_model).
However, this method doesn't take into account the spatial consistency of the points... but it's possible to check that, too, for the top k images we have votes for (k << N, the number of all images in the system).
此代码为每个图像创建一个矩阵,将它们全部附加在一起,然后创建一个 FLANN 索引,对其进行 KNN 搜索,然后返回匹配项。所有代码都在这里:
This code makes a Matrix of each image, appends them all together, then gets makes a FLANN Index, does an KNN search on it, and then returns the matches. All the code is here: