图片自取区
chess.jpg house.jpg girl123
基本原理
cv2.cornerHarris()
参数 | 说明 |
---|---|
img | 数据类型为float32的入口图像 |
blockSize | 数据类型为float32的入口图像 |
ksize | Sobel求导中使用的窗口大小 |
k | 取值参数为[0.04,0.06] |
import cv2
import numpy as np
img=cv2.imread('chess.jpg')
print('img.shape:',img.shape)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray=np.float32(gray)
dst=cv2.cornerHarris(gray,2,3,0.04)
print('dst.shape:',dst.shape)
img[dst>0.01*dst.max()]=[0,0,255]
cv2.imshow('dst',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像尺度空间
多分辨率金字塔
高斯差分金字塔(DOG)
DOG定义公式
DOG极值空间检测
关键点的精确定位
消除边界响应
每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋值给复制后的特征点,一个特征点就产生了多个坐标、尺度等,但是方向不同的特征点。
生成特征描述
为保证特征矢量的旋转性不变,要以特征点为中心,在附近邻域内将坐标轴旋转θ角度,即将坐标轴旋转为特征点的主方向。
旋转之后的主方向为中心取8×8的窗口,求每个像素的梯度幅值和方向,箭头方向代表梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算,最后在每个4×4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,即每个特征点由4个种子组成,每个种子点有8个方向的向量信息。
论文中建议对每个关键点使用4×4共16个种子点来描述,这样一个关键点就会产生128维的SIFT特征向量。
opencv3.x.的cv2.drawKeypoints() 函数主要五个参数:
参数 | 说明 |
---|---|
image | 也就是原始图片 |
keypoints | 从原图中获得的关键点,这也是画图时所用到的数据 |
outputimage | 输出 //可以是原始图片 |
color | 颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。 |
flags | 绘图功能的标识设置 |
import cv2
import numpy as np
img=cv2.imread('girll23.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#查看opencv版本
cv2.__version__
#'3.4.1'
#得到特征点
sift=cv2.xfeatures2d.SIFT_create()
kp=sift.detect(gray,None)#特征提取
img=cv2.drawKeypoints(gray,kp,img)
cv2.imshow('drawKeypoints',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#计算特征
kp,des=sift.compute(gray,kp)#compute特征匹配
print(np.array(kp).shape)
#(116,)
des.shape
#(116, 128)
des[0]
'''array([ 62., 3., 0., 0., 0., 0., 1., 6., 149., 3., 0.,
0., 0., 1., 6., 50., 38., 4., 9., 14., 17., 5.,
15., 26., 5., 2., 5., 20., 144., 33., 0., 0., 58.,
2., 0., 0., 0., 0., 0., 5., 149., 9., 0., 0.,
0., 10., 12., 40., 37., 1., 6., 13., 16., 107., 29.,
12., 0., 0., 3., 15., 113., 61., 3., 0., 10., 1.,
0., 0., 0., 0., 0., 5., 149., 56., 0., 0., 0.,
3., 5., 28., 109., 13., 0., 0., 37., 122., 19., 9.,
0., 0., 0., 0., 124., 128., 4., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 149., 62., 0., 0., 0., 0.,
0., 5., 135., 60., 3., 3., 46., 30., 1., 4., 1.,
0., 0., 1., 42., 101., 21., 4.], dtype=float32)'''