多语言展示
当前在线:1170今日阅读:103今日分享:49

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

相比角点检测的Harris和shi-tomas方法,sift方法具有角度和尺度不变性,不论平移、旋转、缩放、亮度、遮挡和噪声对特征点检测没有影响。而且根据数学计算还具有速度快,适合大数据量等特点。
工具/原料
1

python opencv contrib

2

pycharm windows7

方法/步骤
2

import cv2 as  cvimport copyimage = cv.imread('c:\\meiping1.png')cv.imshow('image', image)image1 = copy.copy(image)image2 = copy.copy(image)继续以梅瓶为例copy几个图像为输出特征点

3

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow('gray', gray)首先转化成灰度

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)

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:对每个特征点进行区分,缺省-1octave:从金字塔哪层提取的得到的数据。pt:特征点坐标response:该点角点的程度。size:直径

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差不多

7

小结:1)不论自己画还是调用函数画圈 都可以2)sift = cv.xfeatures2d.SIFT_create()keypoints, features = sift.detectAndCompute(gray, None)实现特征点检测3)opencv contrib的安装

注意事项
1

xfeatures2d.SIFT_create和老版本SUIF不同

2

自己画圈更灵活,建议自己画

3

detectAndCompute有两个输出

推荐信息