2

我有一堆不同的Feature类来计算图像特征。
我必须从这些类中提取“关键特征”,这些“关键特征”将打包在一起作为搜索键。
我还将存储部分Feature课程。我不能存储整个要素类,因为那样效率很低。

现在,我想到的是编写一个Stored_features将“关键特性”放在一起的类。
我的布局是:

   Facial_features
   |      |       |
   |      V       |
   | .---Feature1 V   <|-- Abstract_feature
   | | .---Feature2   <|---'
   V V V
  Stored_features

我的问题是这样的Stored_features类会有很多 getter 和 setter,据我所知,getter 和 setter 表示设计不好。有没有一种易于维护的方法来避免这里有太多的 getter 和 setter?

关键是我看到我的代码在这里与这个布局非常紧密地结合在一起:(

编辑:

我的代码按要求提取。

#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 的项目。

4

3 回答 3

2

许多 getter 和 setter 本身并不表示设计不好。但是,它们可能暗示您的课程可以分解为较小的课程。以“客户”为例,如果您将所有名称、地址、送货地址字段放在一个类中,那将是一个糟糕的设计,您应该使用“地址”类进行拆分。

我不确定你的设计是关于什么的,关键是如果你需要 100 个吸气剂,因为你有 100 个,不相关的字段使用 100 个吸气剂

于 2012-11-12T19:31:37.533 回答
1

你可能应该少literal考虑你的特征,多考虑抽象和数学术语。您似乎将面部描述为面部特征的组合,每个面部特征都使用某种程序计算,因此每个单独的面部特征都会为单个特征向量贡献一个(或可能几个)标量值。因此,我建议将您的特征存储为:向量。使用一些向量类(std::vector 可能有效,但您可能会考虑使用线性数学库,原因我将在下面解释)。

extract如果您愿意,您仍然可以从这些向量中标量面部特征。例如,如果您有N特征,则可以将其保存在一N维列特征向量x中。现在,您可以将任何线性提取运算符编写为行向量甚至矩阵A,并获得所需的f特征f = A*x。如果你想存储这些矩阵和向量,你最好使用像 Boost uBLAS 这样的库。

现在,您仍然应该以某种方式表达您的搜索查询。然后,您应该在向量中重写您的搜索查询,而不是使用 getter 和 setter,并且您可以以距离(欧几里德、曼哈顿)为例来计算存储的人脸与查询的匹配程度。

总结一下:以更数学的方式开发您的业务逻辑,因为这使您以后可以更自由地扩展系统,并且还可以省去您的麻烦,因为您不必为每个功能都想好名字。并制作一个漂亮的 GUI,这样用户就不必输入复杂的数学公式。

于 2012-11-12T20:23:16.153 回答
0

类的大小应该是它自己的问题。

在这种情况下,我发现我需要的只是pack()每个要素类的一个函数,它可以删除我不想存储的所有数据。然后我可以按原样存储类,而不必关心它们的大小。

于 2012-11-14T14:32:52.360 回答