0

私の質問は、2つの異なる側面で尋ねることができます。1つはデータ構造の観点から、もう1つは画像処理の観点からです。データ構造の観点から始めましょう。次のクラスが示すように、いくつかの小さなアイテムで構成されるコンポーネントがあるとします。

class Component
{
public:
  struct Point
  { 
     float x_;
     float y_;
  };
  Point center;
  Point bottom;
  Point top;
}

上記の例では、Componentクラスは、center、bottom、top(小さなアイテム)などのメンバー変数で構成されています。

これで、コンポーネントのスタックができ(コンポーネントの数は1000から10000の間)、スタック内の各コンポーネントには異なる値が割り当てられました。つまり、スタック内に重複するコンポーネントはありません。次に、コンポーネント内の1つの小さなアイテム、たとえば、図解されたクラスの「center」がわかっている場合、スタック内の一意のコンポーネントを見つけることができます。その後、コンポーネント内の他のプロパティを取得できます。次に、私の質問は、検索を容易にするために適切なコンテナデータ構造を構築する方法です。今、私はベクトルを使用して、STL(擬似コード)でアルゴリズムを見つけることを検討しています:

vector<Component> comArray;
comArray.push_back( component1);
.....
comArray.push_back(componentn);
find(comArray.begin(), comArray.end(), center);

この問題を解決するためのより効率的なコンテナがあるかどうか疑問に思いました。

画像処理の観点からも私の質問を説明することができます。画像処理では、接続コンポーネントの分析はオブジェクト認識にとって非常に重要なステップです。これで、私のアプリケーションでは、画像内のすべての接続コンポーネントを取得できます。また、興味深いオブジェクトが次の要件を満たす必要があることもわかりました。それらの接続コンポーネントの中心は特定の範囲内にある必要があります。したがって、この制約があれば、接続されている多くのコンポーネントを削除して、候補のコンポーネントで作業することができます。上記の手順の重要なステップは、中心座標制約が指定されている場合に、連結成分の候補を検索する方法です。任意のアイデアをいただければ幸いです。

4

4 に答える 4

2

それらをかなり速く取得できるようにする必要がある場合は、ここに少し奇妙な解決策があります。

一般的に言えば、これは悪い解決策ですが、あなたに合っているかもしれないことに注意してください。

あなたは普通を作ることができますvector< component >。または、単純な配列にすることもできます。次に、3つのマップを作成します。

map< Point, Component *>center
map< Point, Component *>bottom
map< Point, Component *>top

centerそれらに、bottomおよびキーとして使用可能なすべての値をtop入力し、対応するコンポーネントへのポインターを値として提供します(ベクトルでインデックスのみを使用することもできるので、そうなりますmap< Point, int >)。

その後、、、またはを使用してcenter[Key]、値(ポインターを格納する場合)または配列内の値のインデックス(インデックスを格納する場合)のいずれかを取得します。bottom[Key]top[Key]

私はそのようなアプローチを頻繁に使用しませんが、値が変更されない場合(インデックスマップを一度埋めることができるため)、データ量がかなり多い場合(したがって、並べ替えられていないベクトルの検索が遅い場合)、および頻繁に検索する必要があります。

于 2012-07-27T09:40:26.097 に答える
1

おそらく、空間インデックスデータ構造が必要です。

于 2012-07-27T09:37:17.710 に答える
0

mapまたはhash_mapを使用して、「center」値に基づいてコンポーネントを効率的に検索したいと思います。

std::map<Component::Point, Component> lookuptable;
lookuptable[component1.center] = component1;

....

auto iterator = lookuptable.find(someCenterValue)
if (iterator != lookuptable.end())
{
    componentN = iterator->second;
}

与えられた調整された範囲内にあるあなたのセットの要素を見つけることに関して。これを行うにはいくつかの方法があります。簡単な方法の1つは、コンポーネントリストの2つの並べ替えられた配列を作成することです。1つはX軸で並べ替えられ、もう1つはY軸で並べ替えられます。次に、一致する要素を見つけるために、ターゲットに最も近い軸をいずれかの軸で二分探索します。次に、範囲外になるまでアレイを上下にスキャンします。また、 kdツリーを使用して、すべての最近傍を見つけることもできます。

于 2012-07-27T09:34:42.310 に答える
0

一定時間内にそれらにアクセスしたいが、それを変更したくない場合。std::setはあなたのコードにとって良い選択だと思います。

set<Component> comArray;
comArray.push_back( component1);
.....
comArray.push_back(componentn);
set<Component>::iterator iter = comArray.find(center)

もちろん、クラスComponentとネスト構造体Pointにはoperator==と書く必要があります。

于 2012-07-27T09:54:00.447 に答える