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とは別に、 thisthisthisthisthis 、およびthis

cv::ORBも見つかりましたが、 OrbFeatureDetector は見つかりませんでした。ここにいくつかの「トレース」があります(当時は「候補」でした) が、どのバージョンの opencv を使用しているのだろうか... file をインクルードしようとしました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 へのポインターを定義するだけです。

FeatureDetector* detector;

さらに、OpenCv のスマート ポインターを使用できます。

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