I have two images of real world. (IMPORTANT)I approximately know transformation of one real world to another. Due to texture problem I don't get enough matches between two images. How can I bring transformation information into account to get more and correct matches by using SIFt. Any idea will be helpful.
4 回答
如果您知道变换,则应用变换,然后将 SURF/SIFT 应用于变换后的图像。这是在大的视角变化中扩展特征描述符/匹配器的鲁棒性的一种标准方法。
您是否尝试过其他替代方案?你确定 SIFT 是答案吗?首先,OpenCV 提供了 SIFT 等工具。(目前,我对 OpenCV 的评价还不够高)。
如果我要解决这个问题,我会首先尝试:
- 对你的两个图像进行下采样以减少“纹理”的影响,即 cvPyrDown。
- 执行一些特征检测:边缘检测等。OpenCV 提供了一个 Harris 角点检测器等。谷歌“cvGoodFeaturesToTrack”了解一些细节。
- 如果您对自己的转换充满信心,请利用您的先验信息并在与转换位置对应的邻域中寻找特征。
如果您仍想查看 SIFT 或 SURF,OpenCV 也提供了这些功能。
还有另一种选择:
在筛选参数中,对比度阈值设置为 0.04。如果您减少它并将其设置为较低的值(0.02,0.01),SIFT 会找到更多足够的匹配项:
SIFT(int nfeatures=0, int nOctaveLayers=3, double contrastThreshold=0.04 , double edgeThreshold=10, double sigma=1.6)
我认为第一步是尝试使用 SIFT 算法的设置来找到针对您的问题的最佳效率。
另一种更有效地使用 SIFT 的方法是将颜色信息添加到 SIFT。因此,您可以将描述符中正在使用的点的颜色信息 (RGB) 添加到其中。例如,如果您的描述符大小是 10x128,那么它表明您在每个描述符中使用了 10 个点。现在您可以提取并添加三列,并使大小为 10x(128+3) [RGB for each point]。这样,SIFT 算法将更有效地工作。但请记住,您需要对描述符应用权重,并使最后三列比其他 128 列更强。实际上,在您的情况下,我不知道图像如何。但这种方法对我帮助很大。您可以看到,这种修改使 SIFT 成为比以前更强大的方法。可以在此处找到类似的实现。