2012-03-07 4 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이 (다시) 구현되었습니다. 나도 같은 새로운 기술자 추출기 (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