Feature
画像の特徴を計算するさまざまなクラスがたくさんあります。
これらのクラスから、検索キーとして一緒にパックされて使用される「キー機能」を抽出する必要があります。また、クラス
の一部も保存します。Feature
非常に非効率的であるため、フィーチャクラス全体を保存することはできません。
さて、私が考えたのはStored_features
、「主な機能」をまとめたクラスを書くことです。
私のレイアウトは次のとおりです。
Facial_features
| | |
| V |
| .---Feature1 V <|-- Abstract_feature
| | .---Feature2 <|---'
V V V
Stored_features
私の問題は、そのようなStored_features
クラスには多くのゲッターとセッターがあり、私が知る限り、ゲッターとセッターは悪い設計を示しているということです。ここでゲッターやセッターが多すぎるのを避けるための簡単に保守できる方法はありますか?
重要なのは、私のコードがこのレイアウトと非常に緊密に結合されているのを見るということです:(
編集:
要求に応じてコードを抽出します。
#include <opencv2/core/core.hpp>
class Abstract_feature{
public:
virtual void calculate()=0;
virtual void draw(cv::Mat& canvas)=0;
/// to put values into Stored_features
virtual void registrate_key_values(Stored_features&) const=0;
};
class Facial_features : Abstract_feature{
public:
virtual void calculate()
{
es.calculate; sc.calculate;
/*etc but iterating over a list of Abstract_feature's*/
}
Stored_features get_stored_features() const
{
return sf.clone();
}
private:
Stored_features sf;
Head_size es;
Skin_color sc;
};
class Head_size : public Abstract_feature{
//you can guess the impl.
};
class Stored_features{
public:
typedef enum{SKIN_COLOR=0, HEAD_SIZE_WIDTH,HEAD_SIZE_HEIGHT} Name;
public:
void set_key_feature(Name, double value);
cv::Mat get_feature_vector() const {return key_values;}
private:
cv::Mat key_values;
// and here would come other features eg.
cv::Rect head_roi; // I don't search based on these. (So I should not use getters/setters?)
};
とにかくopencvベースのプロジェクトであるためにopencvを追加しました。