C++ 如何改进opencv中的特征检测

C++ 如何改进opencv中的特征检测,c++,opencv,image-processing,feature-detection,feature-extraction,C++,Opencv,Image Processing,Feature Detection,Feature Extraction,我正在做一个项目,我需要使用opencv检测图像上的特征 我正在使用 SURF detector; SURF extractor; BFMatcher matcher; 用于检测、提取和匹配点。它在某些图像上运行良好,但在其他一些图像上失败 例如,系统在此映像上失败: 显然,这幅图像有一些纹理,特征检测器应该检测到它们,但没有检测到特征,因此不会生成匹配 如何改进此功能检测 我可以使用任何图像处理技术吗 是否有其他检测器可以帮助解决这个问题?我没有使用SURF,而是使用ORB算法。为了改进特

我正在做一个项目,我需要使用opencv检测图像上的特征

我正在使用

SURF detector;
SURF extractor;
BFMatcher matcher;
用于检测、提取和匹配点。它在某些图像上运行良好,但在其他一些图像上失败

例如,系统在此映像上失败:

显然,这幅图像有一些纹理,特征检测器应该检测到它们,但没有检测到特征,因此不会生成匹配

如何改进此功能检测

我可以使用任何图像处理技术吗


是否有其他检测器可以帮助解决这个问题?

我没有使用SURF,而是使用ORB算法。为了改进特征检测,我尝试了几种过滤器。我得到的最好的结果是结合了均衡直方图和快速傅立叶变换的滤波器

均衡直方图过滤器:它增强了无意义的细节,隐藏了重要但较小的高对比度像素,这些像素被认为是噪声。直方图均衡化采用单调、非线性映射,该映射重新分配输入图像中像素的强度值,以便输出图像包含均匀的强度分布(即平坦直方图)

快速傅里叶变换滤波器:它将图像分解为正弦和余弦分量。由该滤波器执行的变换的输出表示频域中的图像,而输入图像是空域等效图像。在傅里叶域图像中,每个点表示空间域图像中包含的特定频率

我不确定,但我认为在OpenCV中没有FFT滤波器,所以您可能需要使用另一个库

编辑1: 我有一个代码,但不幸的是它是在java中而不是C++中。但如果应用相同的过滤器,结果将是相同的。是Eqaulize直方图的文档。为了应用FFT滤波器,我使用了ImageJ,它是Java库。您可以尝试查找类似于此库的内容,例如

Edit2:ImageJ代码应用FFT滤波器

import ij.plugin.filter.FFTFilter;
...
FFTFilter fft = new FFTFilter();
ImageProcessor ip = new ColorProcessor(bufImage);
ImagePlus imgPlus = new ImagePlus();

imgPlus.setImage(bufImage);

try{
   fft.setup(null, imgPlus); 
}catch(Exception e){e.printStackTrace();}
fft.run(ip);
Edit3:以下是应用上述过滤器前后检测到的功能的示例

  • 不带任何过滤器的冲浪:
  • 使用EH+FFT进行冲浪:
  • 带EH+FFT的ORB:
  • 正如您在SURF算法中看到的,有太多的冗余信息无法执行匹配。所以我建议你使用ORB算法。此外,ORB的优点是,它是免费使用,高效和稳定的图像旋转和规模。您还可以在应用EH+FFT仅检测角点上的特征之前平滑图像


    编辑4:我还发现了有关FFT的有用信息。FFT是DFT的一种有效实现。这是描述的。这也可能是最近四个问题的答案。

    谢谢,你能分享一些代码吗?例如,如何对输入图像进行直方图均衡化?还是使用FFT?我在编辑部分留下了一些评论。谢谢,我使用了HistorogrameQualifier,它看起来有很大的不同。如何使用FFT?你在从图像中过滤低频吗?例如,您是否要转到fft域,删除一些频率并返回到空间域?删除哪个频率?结果图像应在空间域中表示。关于我删除的频率,我不确定。我使用了ImageJ的默认值。我将添加一些关于如何使用FFT的java代码。感谢您提供有关FFT的信息,但我怀疑它是否是FFT,因为它们的计算方式与FFT的计算方式不同。这更像是某种金字塔计算。