2014-01-09 26 views
2

我試圖找到「robocup的球」。因爲它是橙色的,所以我隔這個顏色和試驗後,如果它是圓的或不...我怎麼找到橙色的球?

下面是該方法不起作用的圖像,但對於其他人它的工作原理:

enter image description here

rgb = imread('E:/robot12.jpg'); 
imshow(rgb); 
hsv=rgb2hsv(rgb); 
h=hsv(: , : ,1); 
s=hsv(: , : ,2); 
v=hsv(: , : ,3); 
bw= (h>0.05 & h<0.12) & (s>0.6) & (v> 0.51); 
imagesc(bw) 
colormap(gray) 
se = strel('disk',2); 
bw = imclose(bw,se); 
bw = imfill(bw,'holes'); 

imshow(bw) 
ball1 = bwareaopen(bw, 50); 
imagesc(ball1); 
lab = bwlabel(ball1); 
s = regionprops(lab, 'Area', 'Perimeter'); 
sArea = [s.Area]; 
sPerim= [s.Perimeter]; 
metric= sPerim.^2/(4*pi.* sArea); 
idx = find(metric > 0.7); 
gr_fin = ismember(lab, idx); 
imshow(gr_fin) 


stat = regionprops(gr_fin,'centroid'); 
imshow(rgb); hold on; 
for x = 1: numel(stat) 
    plot(stat(x).Centroid(1),stat(x).Centroid(2), 'wp','MarkerSize',20,'MarkerFaceColor','b'); 
    end 

我不知道如何解決它...

任何一個可以幫助我?

回答

1

好吧,首先,存在metric的錯誤。

後,你做你的處理,圖像中有兩個不同的斑點,標爲1(灰色)和2(白色)。

blobs

所以,sAreasPerim將有兩個1x2陣列。要對你有需要修復的行成兩個斑點的度量值: metric= (sPerim.^2)./(4*pi.* sArea);

的一點是,這個指標給你1一個完美的圓,所以我相信,這將是更好,如果你有一個上也是門檻,不僅metric > 0.7。例如,對於上面的斑點,則返回的值是:

metric = 3.1406 1.9596

這意味着其中沒有類似於正圓。

的第二個問題是,真正的球不是由顏色閾值完全找到,因爲它成爲在點太「淺黃色」是燈光打它。這在很多光線充足的照片中會很常見,而且在陰影之後它會變暗。

爲了解決這個問題,你需要讓你讓更多的黃色和紅色的變化,以放鬆的色調值。你會有更多的誤報,但你希望他們不會通過你的探測器的其餘測試。

我試圖bw= (h>0.04 & h<0.15) & (s>0.6) & (v> 0.51);這是結果:

blobs 2

我不僅改變了色調值,但是你可以看到什麼適合你用你的照片的其餘部分。

該圖像產生的度量值:

metric = 2.2190 1.1703

所以用的1.3>metric>0.7閾值,你會識別只有正確的斑點。

result

主要的一點是,所有這些過程依賴於許多任意的限制,這使得它容易受到錯誤。對照片進行修剪可能很簡單,但重點是要對所有輸入保持穩定。我認爲對於這個特定的球,唯一的變化就是太黃/白或黑/棕。

如果你不想搜索另一個策略,你可以看到什麼值在測試中效果最好。

+1

非常感謝很多兄弟,它確實有效 – siavash

+0

高興它幫助。 :) –

+0

並且度量標準也應該變爲'metric =(4 * pi。* sArea)./(sPerim。^ 2);' – siavash

0

我簡單地更新爲HSV門檻,我得到一個不錯的結果,我不知道這是否是幫助

體重=(H> 0.05 &^h < 0.15)&(S> 0.8 )&(v> 0.8);

enter image description here