在 bagOfFeatures 函数中将参数传递给函数句柄
Passing parameters to function handle in bagOfFeatures function
假设我们有一个自定义提取器函数
[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
bagOfFeatures
函数需要的预期函数类型只能是单一输入,即输入图像。因此,如果你想创建一个可以改变参数的自定义特征提取器,你需要先创建参数,然后创建一个匿名函数,通过词法闭包捕获这些参数。这意味着当您创建匿名函数时,请确保创建了参数,以便当您在匿名函数中引用它们时,它们会在创建函数之前捕获最新版本的参数。
因此,假设 param1
和 param2
已经存在于您的工作区中,创建一个函数,如下所示:
% Create param1 and param2 here
param1 = ...;
param2 = ...;
extractorFcn = @(img) exampleBagOfFeaturesExtractor(img, param1, param2);
这将创建一个匿名函数,它接受一个输入——你的图像。 param1
和 param2
因此在您的函数中被捕获,因此变量的状态被记录下来并在匿名函数中可用。另请注意,该函数不接收其他输入,仅接收输入图像。然后您可以正常调用 bagOfFeatures
。但是,如果要更改param1
或param2
,不仅要更改这些参数,还必须再次重新声明匿名函数,这样变量的最新阶段被重新捕获。
举个简单的例子,假设我创建了一个匿名函数,如下所示:
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
假设我们有一个自定义提取器函数
[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
bagOfFeatures
函数需要的预期函数类型只能是单一输入,即输入图像。因此,如果你想创建一个可以改变参数的自定义特征提取器,你需要先创建参数,然后创建一个匿名函数,通过词法闭包捕获这些参数。这意味着当您创建匿名函数时,请确保创建了参数,以便当您在匿名函数中引用它们时,它们会在创建函数之前捕获最新版本的参数。
因此,假设 param1
和 param2
已经存在于您的工作区中,创建一个函数,如下所示:
% Create param1 and param2 here
param1 = ...;
param2 = ...;
extractorFcn = @(img) exampleBagOfFeaturesExtractor(img, param1, param2);
这将创建一个匿名函数,它接受一个输入——你的图像。 param1
和 param2
因此在您的函数中被捕获,因此变量的状态被记录下来并在匿名函数中可用。另请注意,该函数不接收其他输入,仅接收输入图像。然后您可以正常调用 bagOfFeatures
。但是,如果要更改param1
或param2
,不仅要更改这些参数,还必须再次重新声明匿名函数,这样变量的最新阶段被重新捕获。
举个简单的例子,假设我创建了一个匿名函数,如下所示:
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