用OpenCV提取图片SIFT特征

包括角点检测和计算特征描述子两个过程。

vector<KeyPoint> keyPoint;
Ptr<FeatureDetector> featureDetector;
featureDetector = FeatureDetector::create("FAST");
featureDetector->detect(image, keyPoint);//角点检测
Mat descriptors;
Ptr<DescriptorExtractor> descriptorExtractor;
descriptorExtractor = DescriptorExtractor::create("SIFT");
descriptorExtractor->compute(image, keyPoint, descriptors);//计算特征描述子
KeyPoint有如下参数:
pt(x,y):关键点的坐标
size:该点直径的大小
angle:角度,表示关键点的方向,为了保证方向不变性,SIFT算法通过对关键点周围领域进行梯度运算,
求得该点方向。-1为初值。
response:响应程序,代表该点强度大小。我的理解是该点在图片多个关键点中的权重。"reponse" is indeed an indicator of "how good" (roughly speaking, in terms of corner-ness) a point is.
octave代表是从金字塔哪一层提取得到的数据。
class_id:当要对图片进行分类时,我们可以用class_id对每个特征点进行区分,未设定时为-1,需要自己设定。

descriptorExtractor对关键点周围领域内的像素分块进行梯度运算,得到128维的特征向量。
根据David G.Lowe的建议,对每个关键点,在其周围,用4x4=16个格子进行描述,每个格子包含8个方向的信息,即16x8=128个信息,这就是128维的SIFT特征向量。

猜你喜欢

转载自blog.csdn.net/liminwang0311/article/details/80338033