Ptr SIFT::create
Ptr<SIFT> SIFT::create(int nfeatures = 0,int nOctaveLayers = 3,double contrastThreshold = 0.04,double edgeThreshold = 10,double sigma = 1.6
);参数说明:nfeatures:类型:int默认值:0描述:要保留的最大关键点数量。如果设置为 0 或负数,则不对关键点数量进行限制。nOctaveLayers:类型:int默认值:3描述:每个八度(octave)中的尺度层数量。这决定了金字塔每一层生成多少个尺度空间图像。更多的层意味着更精细的尺度变化检测。contrastThreshold:类型:double默认值:0.04描述:对比度阈值。只有当关键点的主曲率比这个阈值大时才会被保留。较高的值会减少检测到的关键点数量,但提高稳定性。较低的值则相反。edgeThreshold:类型:double默认值:10描述:边缘响应阈值。用于过滤掉那些位于边缘上的不稳定关键点。具体来说,它控制了Hessian矩阵两个特征值的比例。较小的值会导致更多的边缘点被保留,而较大的值则会更加严格地排除这些点。sigma:类型:double默认值:1.6描述:应用于初始图像的高斯模糊标准差。这是构建尺度空间金字塔的第一步,用来确保在不同尺度下的一致性。
示例
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>using namespace cv;
using namespace std;
using namespace cv::xfeatures2d; int main(int argc, char** argv) {Mat src = imread("D:/vcprojects/images/test.png", IMREAD_GRAYSCALE);if (src.empty()) { printf("could not load image...\n");return -1;}namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); int numFeatures = 400; Ptr<SIFT> detector = SIFT::create(numFeatures); vector<KeyPoint> keypoints; detector->detect(src, keypoints, Mat()); printf("Total KeyPoints : %d\n", keypoints.size()); Mat keypoint_img;drawKeypoints(src, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT); namedWindow("SIFT KeyPoints", CV_WINDOW_AUTOSIZE); imshow("SIFT KeyPoints", keypoint_img); waitKey(0); return 0;
}