文章目录
- 1.Harris和Shi-Tomasi特征检测
- 2.SIFT(Scale-Invariant Feature Transform)关键点检测
- 3.SIFT使用过程
- (1)创建SIFT对象
- (2)进行检测,(关键点)KP=sift.detect(img,……)
- (3)绘制关键点,drawKeypoints(gray,KP,img)
- 4.代码实战
- 5.特征匹配
- (1)方式一:关键点匹配
- (2)方式二:关键点匹配
1.Harris和Shi-Tomasi特征检测
2.SIFT(Scale-Invariant Feature Transform)关键点检测
思考:既然有了Harris角点检测,为什么还要SIFT关键点检测呢?
(1)Harris角点具有旋转不变性的特性;但是缩放后,原来的角点有可能不一定为角点了;
可以看到当第一幅图的角点放大之后,就变成了第二幅图的样子,但是再去检测的时候已经不能检测出是角点了,而是边沿了。所以提出了SIFT。
3.SIFT使用过程
(1)创建SIFT对象
(2)进行检测,(关键点)KP=sift.detect(img,……)
(3)绘制关键点,drawKeypoints(gray,KP,img)
其中gray——原始图像,可以使三通道或单通道图像;KP——关键点;img——将点绘制到原始图像上;color——绘制的特征点的颜色信息,默认绘制的是随机彩色;
Flags——
(1)cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
(2)cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对
(3)cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
(4)cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制
4.代码实战
import os
import cv2
import cv2
img=cv2.imread('images/HaLiSi.jpg')
img=cv2.resize(src=img,dsize=(450,450))
gray=cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
#SIFT对象创建
sift=cv2.SIFT_create()
#进行检测,其中第二个参数为None,表示对整张图进行检测
kp=sift.detect(gray,None)
#绘制角点
cv2.drawKeypoints(image=gray,keypoints=kp,outImage=img,color=(0,255,0))
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
print('pycharm')
5.特征匹配
(1)关键点:位置,大小和方向;
计算SIFT描述子:
(2)记录了关键点周围对其贡献的像素点的一组向量值,其不受仿射变换,光照变换等的影响。
(1)方式一:关键点匹配
关键点匹配:
#方式一:进行特征匹配
kp,des=sift.compute(img,kp)
import os
import cv2
import numpy as np
img=cv2.imread('images/HaLiSi.jpg')
img=cv2.resize(src=img,dsize=(450,450))
gray=cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
#SIFT对象创建
sift=cv2.SIFT_create()
#进行检测,其中第二个参数为None,表示对整张图进行检测
kp=sift.detect(gray,None)
#进行特征匹配
kp,des=sift.compute(gray,kp)
print(des)
# kp,des=sift.detectAndCompute(gray)
#绘制角点
cv2.drawKeypoints(image=gray,keypoints=kp,outImage=img,color=(0,255,0))
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Pycharm')
(2)方式二:关键点匹配
同时进行关键点检测和特征匹配
Kp,des=sift.detectAndCompute(img,None)
Img:输入的图像(灰度图);
Mask:指定img中哪个区域进行计算。