matlab imfindcircles:找不到圆时如何处理
matlab imfindcircles : how to deal when no circle is found
我希望在 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
我的问题是收到以下错误消息:
Size mismatch for MATLAB expression 'rayons'. Expected = 1x1 Actual = 0x0
Block MATLAB Function (#41)
While executing: State During Action
据我了解,centres
的维度在未找到圆时并未声明:当找不到圆时我该如何处理(就像测试一样"if one circle is found...")
我不能尝试这个,但是检测何时发生呢?像
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];
计算时间相同,避免错误。
我明白了:我刚刚在分配结果之前测试了函数 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
...
您的回答帮助我找到了正确的语法,感谢您的帮助:)
我希望在 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
我的问题是收到以下错误消息:
Size mismatch for MATLAB expression 'rayons'. Expected = 1x1 Actual = 0x0 Block MATLAB Function (#41) While executing: State During Action
据我了解,centres
的维度在未找到圆时并未声明:当找不到圆时我该如何处理(就像测试一样"if one circle is found...")
我不能尝试这个,但是检测何时发生呢?像
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];
计算时间相同,避免错误。
我明白了:我刚刚在分配结果之前测试了函数 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
...
您的回答帮助我找到了正确的语法,感谢您的帮助:)