android opencv。特征探测器。实现检测

时间:2013-07-04 21:43:39

标签: android c++ opencv android-ndk feature-detection

我想用opencv开发一个android应用程序。 我有这个C ++代码

FastFeatureDetector detector(50);
detector.detect(mGr, v);

此代码正常运行。

现在我想使用不同的探测器:

OrbFeatureDetector detector;
detector.detect(mGr, v);

但是我收到以下错误:

The type 'cv::ORB' must implement the inherited pure virtual method 'cv::FeatureDetector::detectImpl'

原因是什么?

2 个答案:

答案 0 :(得分:0)

有一个基础类,FeatureDetector(链接是最新的文档)。 FeatureDetector具有纯虚方法detectImpl。至少在您的OpenCV版本中。从FeatureDetector(子类)派生的所有类都必须实现该方法。显然,FastFeatureDetector实现了该方法,但OrbFeatureDetector没有实现。

我在documentation中看到有很多子课: 除了FastFeatureDetector,还有thisthisthisthisthisthis

我发现了cv::ORB,但没有找到OrbFeatureDetector。有一些“跟踪”here(当时它是“候选人”),但我想知道您正在使用哪个opencv版本...您是否尝试过包含文件orb.h

无论如何,我建议您,如果还没有,请将opencv版本更新为最新版本,并使用cv::ORB,如此处所述:https://stackoverflow.com/a/12202175/2436175

答案 1 :(得分:0)

code of the feature2d module header中可以看出,类型OrbFeatureDetector是cv :: ORB类的同义词:

typedef ORB OrbFeatureDetector;

深入研究cv :: ORB类的实现我发现它没有虚拟方法,因此你得到的错误消息不应该发生,但是如果你试图例如声明一个cv类型的变量呢:: FeatureDetector:

cv::FeatureDetector detector;

当您希望通过将检测器类型设置为超类的类型时,通常可以轻松切换检测器实现。在这种情况下要克服这个问题,只需定义一个指向cv :: FeatureDetector的指针,如this other stackoverflow question中所述:

FeatureDetector* detector;

您可以使用OpenCv的智能指针:

cv::Ptr<cv::FeatureDetector> detector;