角点检测:
Harris:
使用有三步骤:
检测角点:dst=cv2.cornerHarris(img,blockSize,ksize,k)
img:要为float32类型的单通道图.
blockSize:角点检测时考虑的领域大小
ksize:检测时用的核的大小
k:一个参数(不懂干什么的)范围在0.04到0.06之间.
筛选角点:img[dst>自己设定的阈值]=[B,G,R]颜色
展示角点.
import cv2 as cv
import numpy as np
img=cv.imread('lena.jpg')
#将图片转为灰度图并且为float32类型。
g=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
g=np.float32(g)
#获取角点,并且将角点进行膨胀处理,使其更加明显。
dst=cv.cornerHarris(g,3,3,0.04)
dst=cv.dilate(dst,None)
#筛选角点,留下大于最大角点*0.5的角点
thresh=0.5*dst.max()
img[dst>thresh]=[0,100,0]
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()
阈值设高了,角点较少,可以考虑降低阈值。
Shi-Tomas:
比较harris,对角点更加敏感,效果更好.二者都具有旋转不变性(图片旋转后仍然能检测),但不具备尺度不变性.(图片放大或缩小可能就检测不到角点了)
使用一样有三个步骤:
获取角点:corners=cv.goodFeaturesToTrack(img,maxcorners,qualitylevel,minDistance)
img:灰度图.
maxcorners:所需要的角点数量.
qualitylevel:最低可接受的角点质量水平,范围在0到1之间.
minDistance:角点之间的最小距离,即距离小于该值的两点会被判定为同一个点.
获取角点的具体坐标:
获取的corners可用numpy的ravel来将其打平成一维数组,其中一个元素包含x和y值.
展示.
import cv2 as cv
import numpy as np
img=cv.imread('lena.jpg')
g=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#获取角点信息
corners=cv.goodFeaturesToTrack(g,10,0.5,3)
for i in corners:
x,y=i.ravel()
#将角点信息打平后获取到x和y值,因为获取到的值为浮点型,将其强制转换成整数型即可正常画圆,这个问题找了半天……
cv.circle(img,(int(x),int(y)),10,[0,100,0])
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()
特征点提取:
SIFT:
实例化SIFT特征检测器:sift=cv2.xfeatures2d.SIFT_create( )
获取关键点:keypoints,des=sift.detectAndCompute(img,None)
img:灰度图.
绘制关键点:cv2.drawKeypoints(img,keypoints,outputimg,color,flags=)
keypoints:即上面获取到的.
outputimg:输出的图像
flags:有四种方法
cv2.DRAW_MATCHES_FLAGS_DEFAULT(默认):创建输出矩阵,只绘制每个关键点的中间点.
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:和第一个一样,只不过不创建输出矩阵.
cv2.DRAW_MATCHES_FLAGS_DRAW_RICHKEYPOINTS:对每个特征点绘制大小的方向(向量)
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINT:不绘制单点的关键点.
import cv2 as cv
import numpy as np
img=cv.imread('lena.jpg')
g=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
sift=cv.xfeatures2d.SIFT_create()
kp,des=sift.detectAndCompute(g,None)
cv2.drawKeypoints(img,kp,img,[0,100,0])
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()
SURF:
用法与上面的SIFT一致,只不过创建特征点检测器的API不一样
surf=cv2.xfeatures2d.SURF_create( )
由于该算法受专利保护,我用不了,那就不展示了.
FAST:
实例化FAST特征点检测器:fast=cv2.FastFeatureDetector_create(threshold,nonmaxSuppression)
threshold:阈值,默认为10.
nonmaxSuppression:是否进行极大值抑制,默认为True.
检测关键点:kp=fast.detect(img,None)
绘制关键点:使用cv2.drawKeypoints进行绘制.
import cv2 as cv
import numpy as np
img=cv.imread('lena.jpg')
fast=cv.FastFeatureDetector_create(50)#阈值使用默认值10时特征点太多挡住图片了,故选用50
kp=fast.detect(img,None)#此处和前面的都不一样,仅返回一个参数,即关键点.并且可以传入彩图
cv.drawKeypoints(img,kp,img,[0,100,0])
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()
ORB:
结合了fast算法和brief算法,具有尺度不变性和旋转不变性.
实例化ORB特征点检测器:orb=cv2.ORB_create(nfeatures)
nfeatures:所需特征点的最大数量
检测关键点:kp,des=orb.detectAndCompute(img,None)
绘制关键点:使用cv2.drawKeypoints进行绘制.
import cv2 as cv
import numpy as np
img=cv.imread('lena.jpg')
orb=cv.ORB_create(100)
kp,des=orb.detectAndCompute(img,None)
cv.drawKeypoints(img,kp,img,[0,100,0])
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()