我正在使用OpenCV SURFDetector搜索图像中的关键点。在我的程序中,我想让用户有机会使用跟踪栏设置minHessian的值,但这意味着我必须知道hessian值的范围。

我知道设定的阈值越高,获得的关键点就越少,反之亦然。

有没有一种方法可以计算出粗麻布值的范围,因此我可以在轨迹栏上将0(这是一个非常高的minHessian阈值)设置为“无关键点”,将100(这可能是minHessian = 1或0)设置为“全部”可能的重点”?

我已经看过这个问题,但这对我没有帮助:
Whats the meaning of minHessian (Surffeaturedetector)

编辑:我为我的应用程序找到了一种可行的方法,但是我对该解决方案不满意。这就是我现在正在做的事情:我不断提高我的minHessian并检查是否仍然找到关键点,但是此变体既不快速也不确切,因为我必须采取更大的步骤(在我的情况下为i + = 100)才能更快地获得结果。我很确定还有另一种解决方案。二进制搜索或类似的东西呢?真的不可能计算maxHessian值吗?

这是我的代码:

C#端:

private int getMaxHessianValue()
{
   int maxHessian = 0;
   for (int i = 0; i < 100000; i+=100)
   {
       int numberOfKeypoints = GetNumberOfKeypoints(pathToImage, i);

       if (numberOfKeypoints == 0) // no keypoints found? -> maxHessian
       {
            maxHessian = i;
            break;
       }
   }
   return maxHessian;
}

C++端:
int GetNumberOfKeypoints(char* path, int minHessian)
{
    /// Load image
    Mat templ;
    templ = imread( path, CV_LOAD_IMAGE_GRAYSCALE );


    // Detect the keypoints using SURF Detector

    SurfFeatureDetector detector( minHessian );
    std::vector<KeyPoint> keypoints;
    detector.detect( templ, keypoints );

        // return number of keypoints
    return keypoints.size();
}

最佳答案

关于Hessian [决定因素]的上限,我有相同的问题,而且从理论 Angular 来看,我还没有找到答案。

但是,出于您的特定目的,我建议您转到SURF检测器的源代码,尤其是找到SURFFindInvoker::findMaximaInLayer的部分,您将看到通过以下条件接受/拒绝了关键点检测:if( val0> hessianThreshold)。因此,我认为您可以在IF语句之前插入几行代码,以存储val0的最大值,这将告诉您该特定图像的Hessian最大值。注意,必须确保最大值存储在所有层和 Octave 音阶中,否则,您将只能找到局部最大值。

当然,您可能会想到一些更优雅的方法,但是基本上,您可以在其中直接找到最大值。您实现的是间接找出值(value)的方法。

希望这会有所帮助,Lood Guck!

关于c# - OpenCV SURFD检测器范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22009556/

10-11 07:10