我需要实现一个函数,对位于文件夹(folder1)中的特定数量的图像(nFrame)执行一些图像处理。该函数看起来像:
function imgProc( nFrames,path )
假设我有几个文件夹,每个文件夹中包含不同数量的图像。我需要的是可选的输入参数,这意味着如果用户想要,他可以对前10个图像进行图像处理,但是如果他没有指定数字,那么该函数应该在所有的上执行任务。图片。对于文件夹也是如此,如果用户没有指定他想要从哪个文件夹中获取图像,则应该有一个默认文件夹。用户可以使用0,1或2个输入参数调用该函数也很有趣。
我想过使用这样的exist
函数:
function imgProc( nFrames,path )
if exist( path,'var' ) == 0
path = 'img/record_space';
end
if exist( nFrames,'var' ) == 0
d = dir([ path,'\*.png' ]);
nFrames = length( d( not([ d.isdir ]) ) );
end
end
但是如果我在没有输入参数的情况下调用该函数,则会给出一个错误,指出没有足够的输入参数。 是否可以创建一个可以使其所有参数都可选的函数,并且允许您根据需要输入0,1或2,同时考虑到一个是数字而另一个是字符串?
答案 0 :(得分:4)
要解决代码中的问题:
function imgProc( nFrames,path )
if exist( 'path','var' ) == 0
path = 'img/record_space';
end
if exist( 'nFrames','var' ) == 0
d = dir([ path,'\*.png' ]);
nFrames = length( d( not([ d.isdir ]) ) );
end
end
exists
期望变量名称,而不是变量本身。您可以传递包含字符串的变量,但它会检查该字符串是否存在:
x='y'
exist(x,'var') % checks if y exists
exist('x','var') %checks if x exists
我建议使用inputParser
function imgProc( varargin )
p = inputParser;
addOptional(p,'frames',inf,@isnumeric);
addOptional(p,'path',pwd,@(x)exist(x,'dir'));
parse(p,varargin{:});
%lower frames if required to the maximum possible value
frames=min(p.Results.frames,numel(dir(fullfile(p.Results.path,'*.png'))));
%if frame was previously a number (not inf) and is lowered, print a warning.
if frames<p.Results.frames&&p.Results.frames~=inf
warning('parameter frames exceeded number of images present. Frames set to %d',frames);
end
disp(p.Results);
end
调用该函数的可能方法:
>> imgProc
frames: Inf
path: 'D:\Documents\MATLAB'
>> imgProc('frames',1)
frames: 1
path: 'D:\Documents\MATLAB'
>> imgProc('path','foo')
frames: Inf
path: 'foo'
>> imgProc('path','bar','frames',9)
frames: 9
path: 'bar'