1

我在 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 检测器,但我认为正确的处理方式是通过提供实例的工厂类。

我无法弄清楚为什么会发生这种情况,在 Web 上的几个示例中,使用 FeatureDetector 工厂用于这种类型的检测器是完全合法的。我尝试为非自由模块添加标题,但得到了相同的结果。

我将不胜感激。

4

1 回答 1

4

调用 cv::initModule_nonfree(); 主要,在做任何其他事情之前。

于 2013-08-20T06:58:20.897 回答