2013-07-04 2 views
1

Я хочу разработать приложение для Android с opencv. У меня есть этот C++ кодandroid opencv. детекторы. реализовать обнаружение

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

Существует базовый класс, который составляет 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

0

Как можно видеть в code of the feature2d module header тип OrbFeatureDetector является синоним класса резюме :: ОРБ:

typedef ORB OrbFeatureDetector; 

Глядя глубже в реализации класса резюме :: ОРБ я вижу, что не имеет виртуальных методов и, следовательно, сообщение об ошибке вы получение не должно произойти, но это если вы пытаетесь, например, объявить переменную типа cv :: FeatureDetector:

cv::FeatureDetector detector; 

Это обычно делается, когда вы хотите, чтобы иметь возможность легко переключаться реализации детектора, установив тип детектора, как суперкласса. В этом случае, чтобы преодолеть проблему просто определить указатель на резюме :: FeatureDetector, как описано в this other stackoverflow question:

FeatureDetector* detector; 

Даже больше вы можете использовать смарт-указатель OpenCV давал в:

cv::Ptr<cv::FeatureDetector> detector; 
Смежные вопросы