OpenCV-segfault实例化冲浪特征检测器

OpenCV - segfault instantiating surf feature detector

本文关键字:特征检测 检测器 特征 实例化 OpenCV-segfault      更新时间:2023-10-16

我在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工厂进行这种类型的检测器是完全合法的。我尝试为非自由模块添加标题,但得到了相同的结果。

如果有任何见解,我将不胜感激。

调用cv::initModule_nonfree();总的来说,在做任何其他事情之前。