2

「ロボカップのボール」を探しています。オレンジ色なので、この色を分けて、丸いかどうかをテストしてみました...

メソッドが機能しない画像を次に示しますが、他の画像では機能します。

ここに画像の説明を入力

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

直し方がわからない…

誰でもこれで私を助けることができますか?

4

2 に答える 2

1

わかりました、まず第一に、にバグがありmetricます。

すべての処理を行った後、画像には 1 (グレー) と 2 (白) のラベルが付いた 2 つの異なるブロブがあります。

ブロブ

したがって、sAreaandsPerimは 2 つの1x2配列になります。両方のブロブのメトリック値を取得するには、行を次のように修正する必要があります。 metric= (sPerim.^2)./(4*pi.* sArea);

ポイントは、このメトリックが1完全な円形ディスクを提供するということですmetric > 0.7。たとえば、上記のブロブの場合、返される値は次のとおりです。

metric = 3.1406 1.9596

つまり、どれも完全な円に似ていません。

2 つ目の問題は、実際のボールが色のしきい値によって完全に検出されないことです。これは、ライトが当たったポイントでボールが「黄色っぽく」なりすぎるためです。これは多くの明るい写真で一般的であり、影の後ろにあると暗くなります.

この問題を解決するには、色相の値を緩めて、黄色と赤のバリエーションを増やす必要があります。より多くの偽陽性が発生しますが、それらが検出器の残りのテストに合格しないことを願っています。

私は試しbw= (h>0.04 & h<0.15) & (s>0.6) & (v> 0.51);てみましたが、これが結果でした:

ブロブ 2

色相の値を変更しただけですが、残りの写真で自分に合ったものを確認できます。

この画像は、次のメトリック値を生成します。

metric = 2.2190 1.1703

したがって、しきい値を1.3>metric>0.7指定すると、正しいブロブのみが識別されます。

結果

要点は、このすべての手順が多くの任意のしきい値に依存しているため、エラーに対して脆弱であるということです。特に写真用にトリミングするのは簡単かもしれませんが、ポイントはすべての入力に対して堅牢であることです. この特定のボールの場合、唯一のバリエーションは、黄色/白が強すぎるか、暗/茶色になるかのいずれかになると思います.

別の戦略を検索したくない場合は、テストでどの値が最も効果的かを確認できます。

于 2014-01-09T11:32:37.163 に答える
0

hsv のしきい値を更新するだけで、かなり良い結果が得られます。それが助けになっているかどうかはわかりません

bw= (h>0.05 & h<0.15) & (s>0.8) & (v> 0.8);

ここに画像の説明を入力

于 2014-01-09T11:32:46.363 に答える