使用sift实现关键点(特征点)检测

2025-11-20 23:14:44

1、本文实现特征点(角点是一种特征点)获取和标识,特征点的描述的匹配实现未做处理,为下一步特征点描述和匹配做铺垫。

各种数学性质,请自行百度查询。

使用sift实现关键点(特征点)检测

使用sift实现关键点(特征点)检测

2、import cv2 as  cv

import copy

image = cv.imread('c:\\meiping1.png')

cv.imshow("image", image)

image1 = copy.copy(image)

image2 = copy.copy(image)

继续以梅瓶为例

copy几个图像为输出特征点

使用sift实现关键点(特征点)检测

3、gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("gray", gray)

首先转化成灰度

使用sift实现关键点(特征点)检测

4、SIFT特征计算

使用xfeatures2d.SIFT_create完成SIFT特征点初始化

sift = cv.xfeatures2d.SIFT_create()

sift.detectAndCompute实现特征点和特征点描述分别输出。

keypoints, features = sift.detectAndCompute(gray, None)print(keypoints)

坐标点print(keypoints[0].pt[0], keypoints[0].pt[1])  

特征点描述,后期用于匹配。print(features)

使用sift实现关键点(特征点)检测

5、使用opencv自带的drawKeypoints画圈

image1=cv.drawKeypoints(gray,keypoints,image1)

drawKeyPoints() 

参数1:image:原始图;

参数2:keypoints,特征点向量,元素为KeyPoint对象,包含特征点信息;

参数3:outImage;

参数4:color:特征点颜色;

参数5:flags:设置特征点需要不要画

  DEFAULT:只绘制特征点的坐标点,显示小圆点

  DRAW_OVER_OUTIMG: 

  NOT_DRAW_SINGLE_POINTS:单点特征点不绘制 

  DRAW_RICH_KEYPOINTS:带有方向的圆,显示坐标,大小和方向。

keypoints:

angle:角度,特征点方向,对特征点点邻域梯度计算,获得方向, 缺省-1。

class_id:对每个特征点进行区分,缺省-1

octave:从金字塔哪层提取的得到的数据。

pt:特征点坐标

response:该点角点的程度。

size:直径

使用sift实现关键点(特征点)检测

6、for k in keypoints:

    cv.circle(image2, (int(k.pt[0]), int(k.pt[1])), 2, (255, 255, 0), 1)

cv.imshow("image1", image1)

cv.imshow("image2", image2)

k = cv.waitKey(0)

cv.destroyAllWindows()

手动绘制圆圈 效果和drawKeypoints差不多

使用sift实现关键点(特征点)检测

7、小结:

1)不论自己画还是调用函数画圈 都可以

2)sift = cv.xfeatures2d.SIFT_create()

keypoints, features = sift.detectAndCompute(gray, None)

实现特征点检测

3)opencv contrib的安装

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢