私は、InputParserを使用してMatlab 2016aの適応型しきい値処理ルーチンへの入力を検証しています。MATLAB inputParserの異常動作
入力される:
AdaptBinarize2(Image, 'WeightedNiblack', 'meanWeight', 0.3, 'varianceWeight', 0.5, 'meanWindow', 8, 'varianceWindow', 8);
名前と値のペア 'meanWindow'、8と 'varianceWindow'、8は興味深いものです。
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使用しています:
inputParserのはAdaptBinarizeと同じファイル内のローカル関数です。 isintはAdaptBinarize2()と同じファイル内のローカル関数として定義される:
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)真=:
function bool = isint(x)
epsilon = 10^-9;
if mod(x, 1) < epsilon;
bool = true;
else
bool = false;
end
end
入力を入力し、私はエラーメッセージが表示されます。 meanWindowチェックハンドルを@isnumericに変更すると、解析が成功します。 @isintを使う他のすべての健全性チェックは成功します。同じ値で同時に入力され、それでも渡されるvarianceWindowを含みます。
@isintを@isnumericに変更した後にinputParser構造体から値を抽出すると、値は同じデータ型で同じになります。
私がinputParserのmeanWindowとvarianceWindowの行を切り替えると、testとmeanWindowの受け渡しを変更しない限り、varianceWindowが失敗しても全く同じ動作が逆になります。入力の順序は何の効果もないようです。
何が起こり、なぜですか?
あなたの入力は何ですか? – excaza