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

C++ 使用SURF和FLANN跟踪标记的结果非常糟糕,c++,opencv,computer-vision,C++,Opencv,Computer Vision,我想做的是跟踪一个标记(相当小的一张纸,上面有图画)。我只是想知道它是否在那里。我一直在研究许多不同的算法,比如寻找轮廓,以防我把标记做成一个简单的几何形状(从纸上剪下的星星),当然还有更重要的东西,比如筛选和冲浪 现在,我正在用FLANN试用SURF,我使用的代码是这样的(几乎没有修改): 问题是结果确实不好: 就好像除了我的马克笔,我还能和其他任何东西匹配。。。即使是我用记号笔得到的几次幸运匹配,在两张图像之间也不一样。这是一个大问题,因为我的“真实世界”应用程序将在一个非常“嘈杂”的环

我想做的是跟踪一个标记(相当小的一张纸,上面有图画)。我只是想知道它是否在那里。我一直在研究许多不同的算法,比如寻找轮廓,以防我把标记做成一个简单的几何形状(从纸上剪下的星星),当然还有更重要的东西,比如筛选和冲浪

现在,我正在用FLANN试用SURF,我使用的代码是这样的(几乎没有修改):

问题是结果确实不好:

就好像除了我的马克笔,我还能和其他任何东西匹配。。。即使是我用记号笔得到的几次幸运匹配,在两张图像之间也不一样。这是一个大问题,因为我的“真实世界”应用程序将在一个非常“嘈杂”的环境中,有很多物体,而不是在白色均匀的背景上,相机有点抖动,所以可能也会模糊。起初我还想使用一个比这个小得多的标记(当前的大小/4)

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

另外一些有用的信息:我在raspberry Pi(C++OpenCV,Linux Debian)上运行它,它带有集成的摄像头板,所以分辨率不是最好的,速度也很慢(代码运行1-2分钟),但这不是问题,我不是真的以实时为目标(不过会很好)。 在这个测试中,我使用了巨大的图像(2592x1944),因为我希望结果尽可能好。我应该将分辨率更改为800x600吗?出于某种奇怪的原因,这会提高准确性吗

编辑:根据要求,我的原始图像:


EDIT2:我刚刚运行了蛮力匹配器,得到了完全相同的结果,当我说精确时,我的意思是精确。发布屏幕截图就是复制我以前的屏幕截图。现在我开始认为是我的形象太差了。是否明智的做法是使用更好的相机拍摄参考图像,并使用它匹配另一个(我现在在Pi上使用的那个)拍摄的图像?我知道相机参数可能会起到一定的作用,因此我提出了问题。

似乎问题可能在于模式及其缺乏区分特征。你有没有想过改变这种模式?试试人们用来校准的棋盘。也许,这会给你更多的比赛


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

似乎问题可能在于模式及其缺乏区分特征。你有没有想过改变这种模式?试试人们用来校准的棋盘。也许,这会给你更多的比赛


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

请上传您的原始图像。给您(请参见编辑)。:)我不确定是什么问题。看看这个视频:它在类似的应用程序上显示了更好的结果。也许你应该使用他们的代码(视频的“关于”部分有一个下载链接)。我想我会试试看。谢谢但是,尽管如此,我还是很想知道为什么我的标记检测早些时候失败了,以及其他方法是否比SIFT/SURF更可取。@GilLevi好吧,问题是我没有找到任何与我刚才尝试的方法相匹配的方法。奇怪的是,我在matlab中使用了SIFT和VLFeat,结果非常好(其他图像使用了更多纹理、真实对象等)。现在我想使用OpenCV和C++,我得到的结果令人失望…请上传你的原创图片,这里你可以看到(编辑)。我不确定是什么问题。看看这个视频:它在类似的应用程序上显示了更好的结果。也许你应该使用他们的代码(视频的“关于”部分有一个下载链接)。我想我会试试看。谢谢但是,尽管如此,我还是很想知道为什么我的标记检测早些时候失败了,以及其他方法是否比SIFT/SURF更可取。@GilLevi好吧,问题是我没有找到任何与我刚才尝试的方法相匹配的方法。奇怪的是,我在matlab中使用了SIFT和VLFeat,结果非常好(其他图像使用了更多纹理、真实对象等)。现在我想使用OpenCV和C++,我得到的结果令人失望……嗨,我知道我做这个帖子已经有一段时间了,但是为了完整性,我想说,使用其他图像给了我几乎相同的结果。这次我拍摄了一个徽章的清晰图像。最后,我不得不在我的项目中使用广义Hough变换。我仍然对它为什么不能正常工作感到好奇。我知道SURF和SIFT可能会占用大量内存,所以在Raspberry Pi上运行它们可能与此有关(这是一个带有Pi及其摄像头板的嵌入式系统项目)。但当我检查RAM和CPU消耗时,我并没有发现任何内存问题。奇怪,嗨,我知道我已经有一段时间没见面了