执行检测算法的通用接口

时间:2016-11-06 12:57:42

标签: c++ abstract-class

我陷入困境,请帮助我解决这个问题。

思想: 在不同的检测算法(Say Circle,Triangle和Rectangle)之间有一个共同的接口。

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

其中图片 DetectionStruct 是如下结构:

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是的,我将实现接口(Abstract class)

提前致谢

1 个答案:

答案 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
  };