2012-03-07 116 views
0

在计算机视觉库,基类DescriptorExtractor(用于在一个图像中从关键点提取描述符)是这样写的是:虚拟功能

class DescriptorExtractor 
{ 
public: 
    virtual ~DescriptorExtractor(); 
    void compute(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors) const; 
protected: 
    virtual void computeImpl(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors) const = 0; 
}; 

而对于不同类型的描述符,如筛的冲浪,我们从基类派生:

class SurfDescriptorExtractor : public DescriptorExtractor 
{ 
public: 
    SurfDescriptorExtractor(..){..} 
protected: 
    virtual void computeImpl(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors) const; 
    SURF surf; 
}; 

并且受保护的方法computeImpl被(重新)实现。 我写了一个新的描述符提取MyDescriptorExtractor这需要当前图像(如他人的OpenCV)和以前的形象太像(?):

class MyDescriptorExtractor: public DescriptorExtractor 
{ 
public: 
    ... 
protected: 
    virtual void computeImpl(const Mat& image, const Mat& prev_image, vector<KeyPoint>& keypoints, Mat& descriptors) const; 
} 

我希望这个新类是使用DescriptorExtractor作为参数OpenCV的方法兼容。做这个的最好方式是什么 ?问题是,基类方法compute不会有相同的签名......

感谢

回答

0

需要注意的是子类还是应该服从Liskov substitution principle

不过,解决方法是在MyDescriptorExtractor的构造函数中传递你需要的参数,它允许你保持相同的签名。

+0

我想象一下'MyDescriptorExtractor'的方法叫'keepHistory'必须运行。无论如何,我觉得这些选项有点脏... – Eric 2012-03-07 15:46:45