2017-01-03 3 views
2

これは赤外線カメラを天井に設置して床を歩いている人々を追跡するプロジェクトです。私は、x/y/w/h情報を持つ長方形として 'ブロブ'を取得します。グリッドのセル上のブロブの重なり率を決定するアルゴリズム

本質的に、これらのBLOBをグリッドのセルにパーセントで割り当て/割り当てる必要があります。ブロブがどこにあり、どのセルが重なっているかに応じて、セルは0%〜100% %

これに対処するためのベストプラクティスはありますか? BLOBの位置/サイズをセルに関連付ける方法は?

イメージ:グリッド間隔の係数を使用して、見つかったオブジェクトとグリッドにビンそれを各画素を介してセル暗く、よりブロブ(赤)

The darker the cell, the more the blob (red) overlaps

+0

セルのパーセンテージを計算するのは、その中にあるブロブピクセルの数を数え、ブロブピクセルの総数で割るだけです。編集:私は今あなたの "ブロブ"は長方形として与えられているが、(x、y、w、h)としてそれらを取得する場合は、軸の整列した矩形である必要があります。どちらですか? –

+0

もちろん、グリッドとブロブはすべて軸合わせされています。どのようにセル内にあるBLOBピクセルを数えますか?どのプログラミング言語でデベロップメントができるのか分かりませんが、C++には、矩形の場合はintersection()やunion()などの関数があります。 – alberto2000

+0

グリッドとブロブが軸合わせされている場合は、写真を回転して表示してください。そうでない場合は誤解を招く恐れがあります。 –

答えて

0

に重なる基本的にループ。おそらくより速く、より効率的な方法で必要なことをすることができますが、これで作業が完了します。

int[][] grid 
int gridSpacing 
int[][] objectPix 

for(objectPix[][] "x") 
    for(objectPix[] "y") 
     gridSpacing[Math.Floor(x/gridSpacing)][Math.Floor(y/gridSpacing)]++ 

は、次に最後のステップ(あなたがパーセンテージをしたい場合)には、グリッドを通過し、オブジェクト内の総数のOPピクセルによって、その値を割ます。

詳細/努力をすれば、矩形が1つのグリッド(および各分割のトラック領域)にのみ存在するまで、矩形を分割する賢明な再帰的な解決策を作成できます。しかし、効率が必要な場合は、その解決策を残しておきます。

のみ(C#の場合)の頂点を使用して再帰的な方法:

public void splitRectangle(ref int[][] grid, int gridSpacing, rect curRect) 
    { 
     //if rectangle has verticies in different grid zones, split it 
     if(Math.Floor(curRect.pt.x/gridSpacing) != Math.Floor((curRect.pt.x + curRect.width)/gridSpacing)) 
     { 
      int xDiv = gridSpacing*(Math.Floor(curRect.pt.x/gridSpacing) + 1) - curRect.pt.x; 
      rect split1 = new rect(curRect.pt, xDiv, curRect.height); 
      rect split2 = new rect(new point(curRect.pt.x + xDiv, curRect.pt.y), curRect.width - xDiv, curRect.height); 
      splitRectangle(grid, gridSpacing, split1); 
      splitRectangle(grid, gridSpacing, split2); 
     } 
     else if (Math.Floor(curRect.pt.y/gridSpacing) != Math.Floor((curRect.pt.y + curRect.height)/gridSpacing)) 
     { 
      int yDiv = gridSpacing*(Math.Floor(curRect.pt.y/gridSpacing) + 1) - curRect.pt.y; 
      rect split1 = new rect(curRect.pt, curRect.width, yDiv); 
      rect split2 = new rect(new point(curRect.pt.x, curRect.pt.y+yDiv), curRect.width, curRect.height-yDiv); 
      splitRectangle(grid, gridSpacing, split1); 
      splitRectangle(grid, gridSpacing, split2); 
     } 
     //if rectangle is fully contained within 1 grid zone, then add its area to that gridZone 
     else 
     { 
      grid[Math.Floor(curRect.pt.x/gridSpacing)][Math.Floor(curRect.pt.y/gridSpacing)] += curRect.width * curRect.height; 
     } 
    } 

私はすぐにこれを書いて、それをテストしていないが、それは、私はあなたがやりたいことができますだと思う方法を伝えます。再び、最後のステップはグリッドを通過し、元の矩形領域で分割して元の矩形領域に分割します。

+0

私はこれを見つけました:http://stackoverflow.com/questions/9324339/how-much-do-two-rectangles-overlap - それはあなたの命題に似ていますか? – alberto2000

+0

いいえ、それは全く異なる質問と答えです...技術的には、必要に応じてグリッド内の各セルを候補矩形として扱うことで解決策を適用できます...しかし、それは不合理に非効率的です... –

+0

..あなたは各セルをループし、すべてのブロブを通して各セルループをループし、それらの1つが現在の繰り返しセルと重なっているかどうかを確認する必要があります... – alberto2000

0

グリッド矩形の重複領域を分割よりも計算するのが最善の方法ですグリッド矩形の総面積で計算します。単純なGoogleの検索と読み込みは、これを実装する上で正しい方向に向かわなければなりません。探しているメソッドがあれば、既存の物理ライブラリのいくつかのタイプを使用できます。

+0

あなたはそれを理解しましたか?私に知らせていない場合は、必要に応じてさらにお手伝いすることができます。 –

関連する問題