将参数传递给bagOfFeatures函数中的函数句柄

时间:2017-08-01 07:52:18

标签: matlab image-processing computer-vision feature-extraction matlab-cvst

假设我们有自定义提取器功能

[features,featureMetrics] = exampleBagOfFeaturesExtractor(img,param1, param2)

我想调用bagOfFeatures函数并传递自定义提取函数:

extractorFcn = @exampleBagOfFeaturesExtractor;
bag = bagOfFeatures(imgSets,'CustomExtractor',extractorFcn)

在exampleBagOfFeaturesExtractor函数中,我想根据param1使用不同的局部描述符提取器。 如何将param1传递给exampleBagOfFeaturesExtractor?

在自定义提取器函数中使用不同本地描述符的最佳方法是什么?

感谢您的帮助!

修改

这是我目前使用的自定义提取器功能:

function [features,featureMetrics] = exampleBagOfFeaturesExtractor(img,param1,param2)

    keypoint_detector = cv.FeatureDetector(param1);
    descriptor_extractor = cv.DescriptorExtractor(param2);

    kpts = keypoint_detector.detect(img);
    [ features, kpts ] = descriptor_extractor.compute(img, kpts);
    featureMetrics=ones(1,size(features,1))/size(features,1);
end

1 个答案:

答案 0 :(得分:1)

bagOfFeatures函数所需的预期函数类型只能是单个输入,即输入图像。因此,如果要创建可以改变参数的自定义特征提取器,则需要首先创建参数,然后创建一个匿名函数,通过词法闭包捕获这些参数。这意味着在创建匿名函数时,请确保创建参数,以便在匿名函数中引用它们时,它们会在创建函数之前捕获参数的最新版本。

因此,假设工作区中已存在param1param2,请创建一个如下函数:

% Create param1 and param2 here
param1 = ...;
param2 = ...;
extractorFcn = @(img) exampleBagOfFeaturesExtractor(img, param1, param2);

这会创建一个匿名函数,它接受一个输入 - 您的图像。因此,在您的函数中捕获param1param2,因此记录变量的状态并在匿名函数中可用。另请注意,该功能不接受额外输入,仅接收输入图像。然后,您可以正常呼叫bagOfFeatures。但是,如果您想要更改param1param2,则不仅需要更改这些参数,还必须重新声明匿名函数,以便最新重新获得变量的阶段。

作为一个简单的例子,假设我创建了一个匿名函数,如下所示:

x = 5;
y = @(t) t + x;

此函数y采用当前状态x并将其与变量t相加。就目前而言,这就像我们期望的那样:

>> x = 5;
>> y = @(t) t + x;
>> y(6)

ans =

    11

我们输入了值6,我们得到了11。如果我们尝试更改x然后调用y,它将不会在函数中更改它,因为它在您创建函数之前捕获了变量的状态:

>> x = 10;
>> y(6)

ans =

    11

因此,如果您想更改参数,必须也会在调用bagOfFeatures之前重新声明该函数,因此:

param1 = ...; % Change this to something new
param2 = ...; % Change this if you like as well
extractorFcn = @(img) exampleBagOfFeaturesExtractor(img, param1, param2);

在MATLAB术语中,匿名函数中的这些变量持久。您可以在此处详细了解:https://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html#f4-71621