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 <opencv 2/opencv .hpp>
# include <opencv 2/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 ;
}