这篇不讲原理,只讲怎么实现。
OpenCV常用的特征检测和提取算法有:
ORB:该算法代表带方向的FAST算法和具有旋转不变性的BRIEF算法
通过以下方法进行特征匹配:
暴力(Brute-Force)匹配法
OpenCV使用cornerHarris来识别角点,代码如下:
"""Harris角点检测"""
import cv2
import numpy as np
img = cv2.imread('D:/codes/shan.jpg')#这里使用的绝对路径,可以看着改
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray =np.float32(gray)
dst=cv2.cornerHarris(gray,2,15,0.04)#第三个参数取值3-31之间,,定义了角点检测的灵敏度
img[dst>0.01*dst.max()]=[0,0,255]#将检测到的角点标记为红色
cv2.imshow('corcers',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
为了使cornerHarris函数可以计算,需将图片转为会都格式,然后调用cornerHarris函数:
dst=cv2.cornerHarris(gray,2,15,0.04)
这里最重要的参数是第三个,该算子限定了Sobel算子的中孔(aperture)。Sobel算子通过对图像列、行的变换来检测边缘,Sobel算子会通过核(kernel)来完成检测。也就是说cornerHarris函数会使用Sobel算子,并且第三个参数定义了Sobel算子的中孔,即该参数定义了角点检测的灵敏度,取值在[3,31]奇数。
OpenCV中cornerHarris函数如下:
dst=cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
参数:
SIFT对象会使用DoG检测关键点,并对每个关键点周围的区域计算特征向量。由名字detectAndCompute可知他只执行俩个主要操作:检测和计算,同时其返回值是关键点信息(关键点)和描述符。DoG是对同一图像使用不同高斯滤波器所得到的结果。
import cv2
#import numpy as np
img = cv2.imread('D:/codes/shan.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#创建SIFT对象
sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray,None)
img = cv2.drawKeypoints(image=img, outImage=img,
keypoints = keypoints, flags = 4, color = (51, 163, 236))
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
SIFT和SURF都受专利保护,故而被归类到OpenCV的xgeature2d模块中。SURF是OpenCV的一个类,SURF采用快速Hessian算法检测关键点。
import cv2
img = cv2.imread('D:/codes/shan.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
surf=cv2.xfeatures2d.SURF_create()
keypoints, descriptor = surf.detectAndCompute(gray,None)
img = cv2.drawKeypoints(image=img, outImage=img,
keypoints = keypoints, flags = 4, color = (51, 163, 236))
cv2.imshow("img", img)
k = cv2.waitKey(0)
if k & 0xff == 27:
cv2.destroyAllWindows()