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
...

您的回答帮助我找到了正确的语法,感谢您的帮助:)