我使用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通過的健全性檢查。包含同時輸入相同值且仍然通過的變量窗口。
當改變@isint到@isnumeric值之後提取所述inputParser結構中的值與相同的數據類型相同。
如果我切換meanWindow和varianceWindow的線inputParser完全相同的行爲發生在反向,與varianceWindow失敗除非我改變測試和meanWindow傳遞。輸入的順序似乎沒有任何影響。
發生了什麼,爲什麼?
您的輸入是什麼? – excaza