1

我想用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'

原因是什么?

4

2 回答 2

0

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

我在文档中看到有很多子类:除了FastFeatureDetector,还有thisthisthisthisthisthis

我还找到了cv::ORB,但没有找到 OrbFeatureDetector。这里有一些“痕迹” (当时是“候选人”),但我想知道您使用的是哪个 opencv 版本...您是否尝试过包含文件orb.h

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

于 2013-07-05T06:47:22.670 回答
0

从feature2d 模块标头的代码中可以看出, OrbFeatureDetector类型是 cv::ORB 类的同义词:

typedef ORB OrbFeatureDetector;

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

cv::FeatureDetector detector;

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

FeatureDetector* detector;

你甚至可以使用 OpenCv 的智能指针:

cv::Ptr<cv::FeatureDetector> detector;
于 2013-08-21T01:52:00.347 回答