我想用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'
原因是什么?
答案 0 :(得分:0)
有一个基础类,FeatureDetector(链接是最新的文档)。
FeatureDetector具有纯虚方法detectImpl
。至少在您的OpenCV版本中。从FeatureDetector(子类)派生的所有类都必须实现该方法。显然,FastFeatureDetector实现了该方法,但OrbFeatureDetector没有实现。
我在documentation中看到有很多子课: 除了FastFeatureDetector,还有this,this,this,this,this和this。
我发现了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;