この質問に対する私のシステム設計について否定的なコメントがいくつかあったので(そのようなシステムの実装に関して)、私が問題を提示すれば、より良い提案が得られることを願っています。
ビデオ フレームの機能マッチングに使用するモジュラー アプリケーションを設計しようとしています (たとえば、Sivic、Zisserman によるこの記事の「製品」のように、映画やビデオの非常に近いフレームでのマッチング)。
アイデアは、さまざまな特徴検出アルゴリズムとさまざまな照合手順を簡単に切り替えることができるようにすることです。さらに、私の調査によると、基本的なマッチング手順はわずかしかなく、新しいマッチング方法は主に悪い一致 (同じ記事の空間的一貫性など) に対する追加のプルーニング手順に焦点を当てていると理解しています。すべてのプルーニング手順では、最初のマッチングを実行する必要があります。次に、マッチングによって結合されたベース イメージとクエリ イメージから抽出された特徴に対して追加の作業を行い、不適切な一致を拒否します。
私がデザインに持っていたアイデアは次のとおりです。
- 基本インターフェースを実装する
featureDetector
- すべての具体的な特徴検出アルゴリズムは、インターフェイスから継承し
featureDetector
ます (例:siftDetector
) - 基本インターフェースを実装する
featureMatcher
- すべての具体的なマッチング メソッドは
featureMatcher
インターフェイスから継承します (例:class bruteForceMatcher
または のような OpenCV マッチャーのラッパーcvMatcher
) - との選択を可能にする戦略パターンを実装する基本インターフェースを
imageMatcher
実装するfeatureDetector
featureMatcher
- 一致するすべてのプルーニング プロシージャに対して、基本一致インターフェイスを継承するDecoratorインターフェイスを実装します。
class matcherDecorator : public imageMatcher
- 追加のプルーニング/フィルタリング手順はそれぞれ、
matcherDecorator
インターフェース (例: ) を実装し、(装飾されるコンポーネントを表す) (唯一の) 引数としてspatialConsistencyFilter
コンストラクターのみを含みます。imageMatcher*
この質問で指摘された問題は、機能の検出と照合プロセスの特定の結果から生じ、設計のデコレータ部分に関係しています。それぞれが、両方の画像 (ベースとクエリ)から抽出された特徴と、抽出された特徴間の一致imageMatcher
を保持する必要があります。機能の内部表現は、 のパブリック アクセス機能を介してユーザーに提供される機能記述子とは少し異なります。imageMatcher
class imageMatcher{
private: // or protected:
...
...
std::vector <internalFeatureDescriptor> feats[2];
// no more than 500 - 1000 features can be expected
std::vector <std::pair <int, int> > matches;
// size is the same order of magnitude as the number of features
...
public:
std::vector <userFriendlyFeatures> getFeatures(int baseOrQuery);
const std::vector <std::pair<int, int> > &getMatches();
...
};
ここで、特徴ベクトル (および一致ベクトル) は非常に「重い」ため、それらを使用するときに、ネストされたデコレーター (フィルター) のそれぞれにそれらをコピーしたくありません。ベクターには問題はありません。これmatches
は、デコレーターが参照にアクセスできるようにし、データをコピーする必要がないユーザー向けのパブリック インターフェイスを提供するためです。feats
一方、ベクトルはそのようなインターフェイスを提供せず、それらのアクセス機能では、コピーするだけでなく、フィーチャの内部表現を再計算する必要があります。これにより、デコレーターが内部スーパークラスのポインターのプライベート (または保護された) 変数にアクセスする必要が生じます。
私は、プライバシーの制約に違反することなく、必要なベクトルへの自己アクセスを許可することができました (私は実装上、何も悪いことはしていないと思います)。Decoratorパターンのアイデア。
とはいえ、コードをリファクタリングする方法についての提案、現在の実装に関するコメント、およびアプリケーションの設計に関するその他のあらゆることに興味があります。