在计算机视觉库中,基类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;
};对于不同类型的描述符,如Sift的Surf,我们从基类派生:
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不会有相同的签名...
谢谢
发布于 2012-03-07 22:45:53
请注意,子类化应该仍然遵循Liskov substitution principle。
不过,解决方案是在MyDescriptorExtractor的构造函数中传递所需的参数,该构造函数允许您保留相同的签名。
https://stackoverflow.com/questions/9603525
复制相似问题