2015-11-06 776 views
0

我希望在Simulink模型中使用imfindcircles跟踪带摄像头的圆。当图像上看不到圆圈时,图片中可能会有时间。matlab 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

也,为什么你正在初始化'rayons'和'centres'?你不会得到更快的结果(因为他们是1x1或1x2)。只是不这样做。 –

回答

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

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

+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]; 

的计算时间是一样的,你避免错误。

+0

嗨, 感谢您的建议, 我一直没有检测到圆圈,因为问题来自线 '[中心,人造丝] = imfindcircles(图像,[20 60],'敏感度',0.9,'EdgeThreshold',0.5,'ObjectPolarity','明亮');' 在这种情况下,imfindcircle返回一个0x0为'中心',并引发错误..我应该找到一种方法检查imgfindcircles是否会在将其影响到“中心”之前发送正面结果,但是我错过了语法... – raphael

+0

@raphael即使按照我告诉过你的方式声明'rayons'和'centres'? –