我正在使用inputParser来验证Matlab 2016a中的自适应阈值例程的输入。

输入为:

AdaptBinarize2(Image, 'WeightedNiblack', 'meanWeight', 0.3, 'varianceWeight', 0.5, 'meanWindow', 8, 'varianceWindow', 8);


其中名称/值对“ meanWindow”,8和“ varianceWindow”,8值得关注。

inputParser是与AdaptBinarize相同的文件中的本地函数:

function p = parseInputs(I, algorithm, varargin)

p = inputParser;

deft = 0.5; %default t, mean weight
defs = 2*floor((size(I,1)+size(I,2))/32)+1; %default s, window size
defk = 0; %default k, variance weight
defm = 128; %default m, Sauvola variance term (max variance of uint8)
defPol = 'Bright'; %foreground polarity, 'Bright' or 'Dark'
defGPU = 'False'; %whether to use CUDA

addRequired(p, 'I', @isnumeric);
addRequired(p, 'algorithm', @ischar);

addOptional(p, 'windowSize', defs, @isint);
addOptional(p, 'meanWindow', defs, @isint); %<--- this sucks
addOptional(p, 'varianceWindow', defs, @isint);

addOptional(p, 'meanWeight', deft, @isnumeric);
addOptional(p, 'varianceWeight', defk, @isnumeric);
addOptional(p, 'magicNumber', defm, @isint);

addOptional(p, 'polarity', defPol, @ischar);
addOptional(p, 'UseGPU', defGPU, @ischar);

parse(p,I,algorithm, varargin{:})

end


我正在使用@isint作为验证功能。 isint在与AdaptBinarize2()相同的文件中被定义为局部函数:

function bool = isint(x)

epsilon = 10^-9;

if mod(x, 1) < epsilon;
    bool = true;
else
    bool = false;
end

end


输入输入时,出现错误消息:

Error using AdaptBinarize2>parseInputs (line 371)
The value of 'meanWindow' is invalid. It must satisfy the function: isint.

Error in AdaptBinarize2 (line 67)
p = parseInputs(I, algorithm, varargin{:});
%check all the name-value pairs and datatypes. local function.


isint(8)=真。如果我将meanWindow检查句柄更改为@isnumeric,则解析成功。使用@isint通过的所有其他健全性检查。包括varianceWindow,它同时以相同的值输入并且仍然传递。

在将@isint更改为@isnumeric后,从inputParser结构中提取值时,具有相同数据类型的值相同。

如果我在inputParser中切换meanWindow和varianceWindow的行,则完全相同的行为会反向发生,除非除非更改测试和meanWindow通过,否则varianceWindow会失败。输入的顺序似乎没有任何作用。

发生了什么,为什么?

最佳答案

我认为您需要使用addParameter而不是addOptional

addOptional表示该参数是可选参数。可选参数从第一个参数开始,必须按顺序排列,但以后的参数可以省略,并默认替换。

addParameter表示该参数是参数-值对。参数-值对参数可以以任何顺序出现,并与参数名称及其值成对传递。

R2013b之前的PS,请使用addParamValue而不是addParameter

09-27 21:08