前言:更多请看《计算机视觉学习路》
应用场景:
图像特征是具有独特性,易于识别性,比如角点、斑点以及高密度区
角点:灰度梯度的最大值对应的像素、两条线的交点、极值点
cornerHarris(img , blockSize , ksize ,k)
blockSize : 检测窗口大小
ksize : Sobel的卷积核
k : 权重系数,经验值,一般取0.02-0.04
其基本思想为:
下图中红色的点就是Harris角点
import cv2
import numpy as np
img = cv2.imread('../img/ex03.jpg')
blockSize = 2
ksize = 3
k = 0.04
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Harris角点检测
dst = cv2.cornerHarris(gray, blockSize, ksize, k)
#角点展示
img[dst > 0.01*dst.max()] = [0,0,255]
cv2.imshow('harris',img)
cv2.waitKey(0)
该方法是Harris角点检测的改进,因为k是一个经验值,不好设置,所以该方法不需要设置k值
goodFeatursToTrack(img , maxCorners,...)
maxCorners : 角点的最大数,值为0表示无限制
qualityLevel : 小于1的正数,一般在0.01-0.1之间
minDistance : 角之间最小欧式距离,忽略小于此距离的点,距离越大,检测到的角点越少
mask : 感兴趣区域
blockSize : 检测窗口大小
useHarrisDetector : 是否使用Harris算法 true , false 默认false
k : 当使用Harrris时需要设置,默认0.04
import cv2
import numpy as np
img = cv2.imread('../img/ex03.jpg')
maxCorners = 1000
ql = 0.01
minDistance = 10
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Harris角点检测
corners = cv2.goodFeaturesToTrack(gray, maxCorners, ql, minDistance)
corners = np.int0(corners)
# 绘制角点
for i in corners:
x, y = i.ravel()
cv2.circle(img, (x, y), 3, (255, 0, 0), -1)
cv2.imshow('tomas', img)
cv2.waitKey(0)
Scale-Invariant Feature Transform 与缩放无关的特征转换
提出:Harris角点检测,当图像缩放后,原来的角点可能会消失如下图所示。SIFT就是为了解决这一问题。
检测的步骤
1.创建SIFT对象 sift = cv2.SIFT_create()
2.进行检测 kp = sift.detect(img , mask) # mask感兴趣区域,默认None
3.绘制关键点 drawKeypoints(gray , kp , img) # img是要绘制的图片
import cv2
import numpy as np
img = cv2.imread('../img/ex03.jpg')
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT_create()
kp = sift.detect(gray)
cv2.drawKeypoints(gray,kp,img)
cv2.imshow('SIFT', img)
cv2.waitKey(0)
关键点:位置、大小、方向
关键点描述子:记录了关键点周围对其有贡献的像素点的一组向量值,不受仿射变换、光照变换等影响。
同时计算关键点kp和描述子des:
kp , des = sift.detectAndCompute(img,mask...)
mask : 指明对img的哪个区域进行计算
其作用是进行特征匹配
import cv2
import numpy as np
img = cv2.imread('../img/ex03.jpg')
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT_create()
# 计算关键点和描述子
kp,des = sift.detectAndCompute(gray,None)
print(des)
cv2.drawKeypoints(gray,kp,img)
cv2.imshow('SIFT', img)
cv2.waitKey(0)
Speeded-Up Robust Features
提出:SIFT最大的问题是速度慢,所以有了该算法
1.创建对象 surf = cv2.xfeatures2d.SURF_create()
2.计算关键点和描述子 kp,des = surf.detectAndCompute(img , mask)
检测结果同SIFT,检测到的角点会少一点。
Oriented FAST and Rotated BRIEF
优势:可以做到实时检测
orb = cv2.ORB_create()
kp,des = orb.detectAndCompute(gray,None)
可以看到检测到的特征点非常少,这是因为实时性提高了,计算量减少了,只留下关键点
import cv2
import numpy as np
img = cv2.imread('../img/ex03.jpg')
# 灰度化才能进行角点检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
orb = cv2.ORB_create()
# 计算关键点和描述子
kp,des = orb.detectAndCompute(gray,None)
print(des)
cv2.drawKeypoints(gray,kp,img)
cv2.imshow('ORB', img)
cv2.waitKey(0)