0

SiftFeatureDetector() 和 Ptr 有什么区别?它们显然具有相同的功能。opencv 教程使用 SiftFeatureDetector,但是当点击官方文档时,他们使用 Ptr 并且没有提及 SiftFeatureDetector(),所以我无法阅读它。正如他们在教程中使用的那样:int minHessian = 400; SurfFeatureDetector detector( minHessian );而且我不知道 minHessian 应该做什么。

另外我在同一张图片上尝试了它们,它们都有相同的结果,那为什么它们不同呢?

int _tmain(int argc, _TCHAR* argv[])
{
//initModule_nonfree();
Mat img;

img = imread("c:\\box.png", 0);

//cvtColor( img, gry, CV_BGR2GRAY );

 //SiftFeatureDetector detector;
//vector<KeyPoint> keypoints;
//detector.detect(img, keypoints);

Ptr<FeatureDetector> feature_detector = FeatureDetector::create("SIFT");
vector<KeyPoint> keypoints;

feature_detector->detect(img, keypoints);

Mat output;

drawKeypoints(img, keypoints, output, Scalar::all(-1));

namedWindow("meh", CV_WINDOW_AUTOSIZE);
imshow("meh", output);
waitKey(0);



return 0;

}

谢谢

4

1 回答 1

2

编辑:在下面的评论中查看@gantzer89 的更正。 (为了清晰起见,保留我的原文。)


根据我的一般经验,使用 FeatureDetector::create() 语法(在您引用的“官方文档”中讨论允许在运行时通过参数文件灵活地指定算法,而更具体的类,例如 SiftFeatureDetector,提供更多的定制机会。

create() 方法以一组默认的特定于算法的参数开始,而特定于算法的类允许在构造时自定义这些参数。因此,create() 方法为 minHessian 分配了一个默认值,而 SiftFeatureDetector 构造函数提供了选择 minHessian 值的机会。

根据经验,如果您想快速尝试使用哪种算法,请使用 create() 语法,如果您想尝试微调特定算法,请使用特定于算法的类构造函数。

于 2012-11-04T17:15:27.707 回答