2016-11-06 4 views
0

私は状況に立ち往生しています。一般的なインターフェイスを実行する検出アルゴリズム

考え: 異なる検出アルゴリズム(Say Circle、Triangle、Rectangle)の間で共通のInterfaceを持つこと。 画像DetectionStructは、以下のような構造である

class IDetectionInterface() 
    { 
    public: 
      virtual void PerformDetection(Image & InputImage, DetectionStruct & DetectionData, DetectionParam & DetParam) = 0; 
     virtual ~IDetectionInterface() 
     { 
     } 
    }; 

:検出アルゴリズムのパラメータが異なるよう

struct Image 
{ 
    unsigned char * pImageData; 
    int Width; 
    int Height; 
}; 

struct DetectionStruct 
{ 
    Rect BoundingBox; 
    DectionType DetType; 
}; 

struct Rect 
{ 
    int x; 
    int y; 
    int width; 
    int height; 
}; 

enum DectionType 
{ 
    Circle = 0, 
    Triangle = 1, 
    Rectangle = 2 
} 

問題私にとっては、DetectionParamのことです。たとえば、

struct RectDetectionParam 
{ 
    int param1; 
    float param2; 
    double param3; 
}; 

struct TriDetectionParam 
{ 
    float param1; 
    float param2; 
    double param3; 
    int param4; 
}; 

struct CirDetectionParam 
{ 
    int param1; 
    float param2; 
    bool param3; 
    int param4; 
    float param5; 
}; 

私は上記のように共通のインターフェースを得ることができます。

注:私は、最も簡単な解決策である一つの構造体にすべてのパラメータを入れたくありませんが、アルゴリズムを変更してそれぞれのパラメータが変更され、再度構造体を書き直す必要があるという欠点があります。

そしてOfcourceはい、私はあなたがパラメータは、一般的な設定にするために区別組合を作成することができ、あなたの例に基づいてインターフェイス(抽象クラ​​ス)の実装に事前

+0

その問題を解決するために多くのアプローチがあります。区別された 'union'を使うことは、パラメータ名がキーとして使われる一般的な' std :: map 'の使い方の一つです。 –

+0

私に例を挙げてもらえますか? – Barry

+0

前述のように、ジェネリックパラメータセットの作成方法は多くあります。 –

答えて

0

感謝を持っています。

struct DetectionParams { 
     DectionType detectionType; // Discriminator 
     union { 
      RectDetectionParam rectDect; 
      TriDetectionParam triDect; 
      CirDetectionParam cirDect; 
     }; 
}; 

実装で使用される共用体のパーツは、ディスクリミネータによって決まります。


もう一つの方法は、固有のパラメータ名(キー文字列)に基づいたパラメータセットのようなものを使用することです:

struct DetectionParams { 
     std::map<std::string,std::any> params; // Note that std::any is available 
               // at the not yet official c++17 standard 
    }; 
関連する問題