x86_64 アーキテクチャで Ubuntu 12.10 用の OpenCV 2.4.6.1 の C++ 実装を使用しています。私はいくつかの機能検出器を試してきました。最近、FeatureDetector::create メソッドを使用して SURF 検出器をインスタンス化する際に問題が見つかりました。
次のようにして、FAST や BRISK などの無料の検出器をインスタンス化して使用できます。
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("FAST");
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("BRISK");
しかし、次のようにして、インスタンス化して SURF や SIFT などの非フリー検出器を使用しようとすると、早い段階でセグメンテーション違反が発生します。
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("SURF");
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("SIFT");
それにもかかわらず、それらを実装する具象クラスを直接使用してそれらをインスタンス化できます。
cv::Ptr<cv::FeatureDetector> detector = new cv::SurfFeatureDetector();
cv::Ptr<cv::FeatureDetector> detector = new cv::SiftFeatureDetector();
実行時に検出器/記述子をホット スイッチングする必要があります。システムを微調整して、選択したときに SURF および SIFT 検出器をインスタンス化することはできますが、インスタンスを提供する Factory クラスを使用するのが正しい方法だと考えています。
このタイプの検出器に FeatureDetector ファクトリを使用する Web 上のいくつかの例では、なぜこれが発生しているのかわかりません。nonfree モジュールのヘッダーを追加しようとしましたが、同じ結果が得られました。
洞察をいただければ幸いです。