OpenCV - 如何实现FeatureDetector接口

时间:2013-08-21 03:09:03

标签: c++ opencv feature-detection

我在x86_64架构上使用OpenCV 2.4.6.1的C ++实现用于Ubuntu 12.10。我正在努力将此code of the Agast Corner Detector包装在继承自cv::FeatureDetector

的类中

检查feature2d module header code并观察其他实现,我发现我应该强制实施detectImpl方法:

virtual void detectImpl( const Mat& image, std::vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const = 0;

通常它还实现了一个名为operator的方法,该方法具有以下签名:

CV_WRAP_AS(detect) void operator()(const Mat& image, CV_OUT std::vector<KeyPoint>& keypoints) const;

看看其他实现,我不能确切地说出每种方法应该做什么。第二个operator我猜是以某种方式与检测关键点的检测方法有关:

cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("...");
detector->detect(img, keypoints);

根据您的经验,这两种方法之间的区别是什么?它们应该实现什么?

与使用工厂方法cv::FeatureDetector::create的检测器实例化相关我有一些与类型info的属性AlgorithmInfo*相关的线索,通常作为检测器类实现的公共属性,并且使用features2d_init源文件中的CV_INIT_ALGORITHM。

为了能够使用工厂方法实例化我的自定义FeatureDetector,我应该实现什么?

1 个答案:

答案 0 :(得分:1)

经过几天的工作,我成功完成了我的承诺,并学到了一些关于实施cv::FeatureDetector界面的课程:

  • 将包装类包含在cv名称空间中。

  • 实施的唯一方法是使用您正在使用的OpenCV版本上的方法签名detectImpl

  • 实现operator方法是可选的,在使用它的其他实现中(例如MserFeatureDetectorStarDetector)此方法从detectImpl通过类实例调用:< / p>

    void ...::detectImpl( const Mat& image, std::vector<KeyPoint>& keypoints, const Mat& mask ) const {
    ...
    (*this)(grayImage, keypoints);
    ...
    }
    
    void ...::operator()(const Mat& img, std::vector<KeyPoint>& keypoints) const{
    ...
    }
    
  • 请注意detectImpl是一个const方法,因此它无法修改实例参数,因此在其他检测器实现中完成后,可能会更有用地定义检测器在侧函数上的具体行为(例如{ {1}}或FastFeatureDetector

  • 要使用工厂方法StarDetector来实例化包装器,您应该在类声明中添加公共方法cv::FeatureDetector::create,并使用{{在OpenCV中将类初始化为算法1}}如下:

    AlgorithmInfo* info() const;

    如果您的班级不需要任何参数,您可以简单地用CV_INIT_ALGORITHM

    替换所有参数

    还要提醒您在声明(.h)或定义(.cpp)包装器的源文件之外执行此操作并包含namespace cv{ CV_INIT_ALGORITHM(AgastFeatureDetector, "Feature2D.AGAST", obj.info()->addParam(obj, "threshold", obj.threshold); obj.info()->addParam(obj, "nonmaxsuppression", obj.nonmaxsuppression); obj.info()->addParam(obj, "type", obj.type)); } 库。