我希望在Simulink模型中使用imfindcircles
使用网络摄像头跟踪一个圆圈。图片中可能有时候图像上没有圆圈可见。
我在MATLAB功能块中使用以下代码:
function centreOutput = fcn(image)
coder.extrinsic('imfindcircles');
coder.extrinsic('find');
coder.extrinsic('max');
temp = 0;
rayonMax = 0;
rayons = coder.nullcopy(zeros(1,1));
centres = coder.nullcopy(zeros(1,2));
%set the radius
[centres, rayons] = imfindcircles(image,[20 60],'Sensitivity',0.9,'EdgeThreshold',0.5,'ObjectPolarity','bright');
rayonMax = min(rayons);
temp = find(rayons==rayonMax);
centreOutput = centres(temp,:);
end
我的问题是我收到以下错误消息:
MATLAB表达式'人造丝'的尺寸不匹配。预期= 1x1实际= 0x0 块MATLAB函数(#41) 执行时:执行期间的状态
根据我的理解,centres
的维度不是在没有找到圆圈时声明的:如果没有找到圆圈,我怎么能处理这个问题(就像测试那样“找到一个圆圈......“)
答案 0 :(得分:1)
我无法尝试这一点,但如何检测到这种情况呢?
之类的东西function centreOutput = fcn(image)
coder.extrinsic('imfindcircles');
coder.extrinsic('find');
coder.extrinsic('max');
temp = 0;
rayonMax = 0;
%set the radius
[centres, rayons] = imfindcircles(image,[20 60],'Sensitivity',0.9,'EdgeThreshold',0.5,'ObjectPolarity','bright');
if (~isempty(centres))
rayonMax = min(rayons);
temp = find(rayons==rayonMax);
centreOutput = centres(temp,:);
else
centreOutput=[]; %return empty (or something else, you choose)
end
end
我相信您的错误可能来自于以奇怪的方式初始化变量,因为您告诉编码器您的变量是1x1和1x2但它们可能不是。
我不确定,但这可能是一个Simulink问题。如果是这种情况,并且您需要初始化变量,请将它们初始化为
rayons = 0;
centres = [0;0];
计算时间相同,可以避免错误。
答案 1 :(得分:1)
我明白了:我刚刚在分配结果之前测试了imfindcircles函数:
...
if (isempty(imfindcircles(image,[30 50],'Sensitivity',0.9)))
centreOutput = [0 0];
else
[centres, rayons] = imfindcircles(image,[30 50],'Sensitivity',0.9);
rayonMax = min(rayons);
temp = find(rayons==rayonMax);
centreOutput = centres(temp,:);
end
...
您的回答帮助我找到了正确的语法,感谢您的帮助:)