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