使用SURF和FLANN跟踪标记的结果非常糟糕

时间:2013-08-28 13:14:31

标签: c++ opencv computer-vision

我想要做的是跟踪一个标记(相当小的纸张和图纸)。我只是想知道它是否存在。我一直在寻找许多不同的算法,比如找到轮廓,以防我将标记变成简单的几何形状(从纸上剪下来的星星),当然还有更严肃的东西,比如SIFT和SURF。

现在我正在尝试使用FLANN进行SURF,我使用的代码就是这个(几乎没有修改): http://docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html

问题是结果真的不好: My results http://img46.imageshack.us/img46/8729/xpu5.jpg

就像我的标记之外的其他所有东西都匹配...即使我用标记得到的几个幸运匹配在两个图像之间也不一样。这是一个很大的问题,因为我的现实世界"应用这将是一个非常"嘈杂"有很多物体的环境,而不是在白色均匀的背景上,相机有点摇晃,所以也许也很模糊。另外,起初我想使用比这个标记小很多的标记(current_size / 4)。

所以我的问题是,如何提高准确性?是否应该制作一个更复杂的纹理具有更多纹理等等(因为我读到SURF / SIFT在检测低纹理对象时不好)?另一个匹配器会有很大的不同,或者我应该使用SIFT吗? 或者,另一种方法/算法对标记更好吗?知道只有当标记完全可见并且不仅仅是它的一部分时才检测到它不会成为问题(这对我来说实际上更方便)。我已经使用了一些基于标记的AR,所以我知道这些库很擅长但我不知道他们使用什么样的算法。 无论如何,我们将非常感谢示例代码,链接或建议。

一些额外的有用信息:我在覆盆子Pi(C ++ OpenCV,Linux Debian)上运行它,使用它的集成摄像头板,所以分辨率不是最好的而且它是&#39 ; s慢(运行代码需要1-2分钟),但这不是问题,我并不是真正的实时目标(虽然会很好)。 对于这个测试,我使用了巨大的图像(2592x1944),因为我希望结果尽可能好。我应该将分辨率更改为800x600吗?是否会因某种奇怪的原因而提高准确性?

编辑:根据要求,我的原始图片: http://img35.imageshack.us/img35/2329/5a93.jpg http://img703.imageshack.us/img703/847/cwg8.jpg

EDIT2:我刚刚运行了Brute Force Matcher并得到了相同的结果,当我说的确切时,我的意思是确切的。发布屏幕截图将复制我之前的屏幕截图。现在我开始认为我的图像很糟糕。用更好的相机拍摄参考图像的照片并使用它来匹配另一个(我现在在Pi上使用的图像)拍摄的图像是否明智?我知道相机参数可以发挥一些作用,因此我的问题。

1 个答案:

答案 0 :(得分:1)

似乎问题可能与模式及其缺乏区别特征有关。你有没有考虑改变模式?尝试像人们用来校准的棋盘格。也许,这会给你更多的比赛。

您还应该调查RANSAC,以确定该计划提供的所有匹配项中的哪些匹配项是正确的。 RANSAC可以在嘈杂的环境中工作。