我在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,我应该实现什么?
答案 0 :(得分:1)
经过几天的工作,我成功完成了我的承诺,并学到了一些关于实施cv::FeatureDetector
界面的课程:
将包装类包含在cv名称空间中。
实施的唯一方法是使用您正在使用的OpenCV版本上的方法签名detectImpl
。
实现operator方法是可选的,在使用它的其他实现中(例如MserFeatureDetector
和StarDetector
)此方法从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));
}
库。