2012-03-07 29 views
0

は、(1枚の画像におけるキーポイントから記述子を抽出するために使用)基本クラス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が(再)実装されています。 私もそのように(OpenCVの中に他の人のように)現在の画像と前の画像を必要とする新しい記述子抽出MyDescriptorExtractorを書いた(?):

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その基底クラスのメソッド...

おかげサブクラス化はまだLiskov substitution principleに従わなければならないこと

答えて

0

注意です。

でも解決策は、コンストラクタで必要なパラメータをMyDescriptorExtractorに渡して、同じシグネチャを保持できるようにすることです。

+0

私は、実行しなければならない 'keepHistory'と呼ばれる' MyDescriptorExtractor'メソッドを想像します。とにかく、私はこれらのオプションが少し汚れているのを見つけます... – Eric