7

シナリオ :

2 つの異なる色のオブジェクトを追跡しようとしています。最初に、ユーザーは最初の色付きのオブジェクト (たとえば、RED の可能性がある) をカメラの前の特定の位置 (画面上に四角形でマークされている) に保持し、任意のキーを押すように求められ、その後、私のプログラムはフレームのその部分を取得します。 (ROI) を取得し、その中の色を分析して、追跡する色を見つけます。2 番目のオブジェクトについても同様です。次に、通常どおり、cv.inRange関数を HSV カラー プレーンで使用し、オブジェクトを追跡します。

行われること:

追跡対象の ROI を HSV に変換し、Hue ヒストグラムを確認しました。以下の2つのケースがあります:

ここに画像の説明を入力 ここに画像の説明を入力

(ここでは主要な中央ピークが 1 つしかありません。しかし、場合によっては、そのようなピークが 2 つ得られます。1 つは大きなピークで、周囲にピクセル クラスターがあり、2 番目のピークは最初のピークよりも小さいですが、大きなサイズで周囲に小さなクラスターもあります。 . 今はサンプル画像がありませんが、ほぼ以下のような感じです (ペイントで作成)

ここに画像の説明を入力

質問 :

How can I get best range of hue values from these histograms?

最良の範囲とは、ROI のピクセルの約 80 ~ 90% がその範囲にあることを意味します。

または、さまざまな色のオブジェクトを追跡するためのこれよりも優れた方法はありますか?

4

1 に答える 1

3

私の理解が正しければ、ここで必要なのはグラフの最大値を見つけることだけです。最大値は必ずしも最高のピークではなく、最大密度の領域です。

これは非常に単純で、科学的ではありませんが高速な O(n) アプローチです。ローパス フィルターを通してヒストグラムを実行します。例えば移動平均。平均の長さは 20 としましょう。その場合、新しく修正されたヒストグラムの 10 番目の値は次のようになります。

mh10 = (h1 + h2 + ... + h20) / 20

ここで、h1、h2... はヒストグラムの値です。次の値:

mh11 = (h2 + h3 + ... + h21) / 20

これは、以前に計算された mh10 を使用して、最初のコンポーネントを削除し、最後に新しいコンポーネントを追加することで、はるかに簡単に計算できます。

mh11 = mh10 - h1/20 + h21/20

唯一の問題は、ヒストグラムの端にある数値をどのように処理するかです。移動平均の長さを利用可能な長さに縮小するか、すでにあるものの前後に値を追加することができます. しかし、いずれにせよ、端でピークを処理することはできませんでした。

そして最後に、この修正されたヒストグラムを取得したら、最大値を取得します。ヒストグラムのすべての値には、自分自身だけでなく隣人も含まれているため、これは機能します。

より洗練されたアプローチは、たとえばガウス曲線を使用して平均に重みを付けることです。しかし、それはもはや直線的ではありません。O(k*n) になります。ここで、k は平均の長さであり、ガウスの長さでもあります。

于 2012-10-29T18:08:00.510 に答える