1

以下のコードは数秒かかります。オブジェクトを色でより速く検出して、リアルタイムで表示できるようにしたいと考えています。

grayImg = input.InRange(new Bgr(selectionRangeSlider1.SelectedMin,
                                selectionRangeSlider2.SelectedMin,
                                selectionRangeSlider3.SelectedMin),
                                new Bgr(selectionRangeSlider1.SelectedMax,
                                        selectionRangeSlider2.SelectedMax,
                                        selectionRangeSlider3.SelectedMax));  

selectionRangeSlider は、1 つの値ラインに 2 つのスライダーを持つカスタム コントロールです。

Rectangle roi; //this rectangle is the product of rectangle recognition, now I want to check if the color of this recangle is at least 50% yellow

int whitePixels = 0;

for (int i = roi.X; (i < (roi.X + roi.Width)); i++)
{
    for (int j = roi.Y; (j < (roi.Y + roi.Height)); j++)
    {
        Byte currentVal = g.Data[i, j, 0];

        if (currentVal == 255) //255 means true: this pixel is yellow
        {
            Console.WriteLine(i + "," + j + " is yellow");
            whitePixels++;
        }
    }
}

if (whitePixels > ((roi.Width * roi.Height) / 2))
{
    // "more that half is yellow";
}
4

1 に答える 1

3

まず、色を見つけたい場合は、画像を HSV モードで分割することをお勧めします。そのように色を追跡する方が簡単です。

次に、この二重の for/loop を実行する代わりに、次の単純な関数を使用します: CountNonZero

非常に遅いため、デバッグの場合を除き、ループ内でコンソールに何かを書き込まないでください。

したがって、これがリアルタイムである必要がある最終的なパイプラインです

  1. 画像を HSV モードに変換する
  2. 3チャンネルに分割
  3. 追跡したい色に応じて InRange を実行します (UI を使用)。
  4. ROIを実行する
  5. CountNonZero。
于 2013-10-15T17:20:14.080 に答える