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

Very bad results for tracking a marker with SURF and FLANN

本文关键字:结果 非常 SURF FLANN 跟踪 使用      更新时间:2023-10-16

我想做的是跟踪一个标记(上面有图纸的纸张相当小)。我只是想知道它是否在那里。我一直在研究许多不同的算法,比如如果我把标记做成一个简单的几何形状(从纸上剪下的星星),就可以找到轮廓,当然还有更严重的算法,如SIFT和SURF。

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

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

这就像我得到了除了我的标记之外的所有其他东西的匹配。。。即使我用记号笔得到的少数幸运匹配在两张图像之间也不一样。这是一个大问题,因为我的"现实世界"应用程序将处于一个非常"嘈杂"的环境中,有很多物体,而不是在白色均匀的背景上,相机会有点抖动,所以可能也很模糊。而且一开始我想用一个比这个小得多的标记(current_size/4)。

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

一些额外的有用信息:我在树莓派(C++OpenCV,Linux Debian)上运行这个,它有集成的相机板,所以分辨率不是最好的,而且速度很慢(运行代码需要1-2分钟),但这不是问题,我并不是真的以实时为目标(尽管这很好)。在这个测试中,我使用了巨大的图像(2592x1944),因为我希望结果尽可能好。我应该把分辨率改为800x600吗?这会因为某种奇怪的原因而提高准确性吗?

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

第二版:我刚刚运行了Brute Force Matcher,得到了完全相同的结果,当我说精确时,我真的是指精确。发布一个屏幕截图就是复制我以前的屏幕截图。现在我开始觉得是我的形象太糟糕了。明智的做法是用更好的相机拍摄参考图像的照片,并用它来匹配另一个(我现在在Pi上使用的那个)拍摄的图像吗?我知道相机参数可能会起到一定作用,因此我提出了这个问题。

问题可能出在模式及其缺乏显著特征上。你想过改变模式吗?试试人们用来校准的棋盘之类的东西。也许,这会给你更多的匹配。

您还应该调查RANSAC,以确定程序给出的所有匹配中的哪一个是正确的匹配。RANSAC可以在相当嘈杂的条件下工作。