特征提取
图像特征:可以表达图像中对象的主要信息、并且以此为依据可以从其他未知图像中检测出相似或者相同图像。
常见的图像特征:边缘、角点、纹理
角点检测:cv2.cornerHarris()
img:输入图像
blockSize:角点检测中要考虑的领域大小
ksize:Sobel求导中使用的窗口大小
k:方程参数,参数为[0.04,0.06]
亚像素级的角点检测:红色是原先的角点,绿色像素是修正后的像素
适合于跟踪的角点检测:cv2.goodFeaturesToTrack():
输入灰度图像、检测的角点数目、设置角点的质量水平,0-1之间,低于这个数的都会被忽略、设置两个角点间的最短欧式距离。
SIFT尺度不变特征变换匹配算法:
cv2.xfeatures2d.SIFT_create():创建sift特征器
sift.detect()可以在图像找到关键点。如果想在图像的特定区域搜索,可以创建一个掩膜图像作为参数。属性如下:
pt:表示图像中关键点的x坐标和y坐标
size:表示特征的直径
angle:表示特征的方向
response:表示关键点强度
octave:表示特征所在金字塔的层级
class_id:表示关键点的ID
sift.compute():计算关键点的描述符,在sift.detect后使用。
sift.detectAndCompute():直接找到关键点并计算出描述符
cv2.drawKeypoints():
image:原始图像
keypoints:特征点向量
outimage:特征点绘制的画布图像,可以是原图像
color:绘制的特征点颜色,可以是原图像。
flags:五种绘制模式:
DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:就会绘制代表关键点大小的圆圈甚至可以绘制除关键点的方向。
DEFAULT:只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
DRAW_OVER_OUTIMG:函数不创建输出的图像,而是直接在输出图像变量空间绘制,要求本身输出图像变量就是一个初始化好了的,size与type都是已经初始化好的变量
NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制
DRAW_RICH_KEYPOINTS:绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐标,size,和方向,是最能显示特征的一种绘制方式
SURF:加速稳健特征算法,加快版的SIFT。与SIFT类似
BRIEF:这是一种特征描述符,他不提供查找特征的方法。所以我们需要使用其他的特征检测器。例如:SIFT或SURF。推荐使用STAR。
orb检测:
bf暴力匹配:
cv2.BFMatcher():创建一个BFMatcher对象。参数:
normType:指定使用的距离测试类型。默认值为cv2.NORM_L2。cv2.NORM_L1也行。这两种适用于SIFT和SURF。对于ORB,BRIEF,应使用cv2.NORM_HAMMING。如果VTA_K==3或4,normType应设置为cv2.NORM_HAMMING2。
crossCheck:默认为False。如果设置为True,匹配条件就会更加严格。
BFMatcher对象具有两个方法:match()和knnMatch()。第一种方法会返回最佳匹配,第二个方法为每个关键点返回k个最佳匹配(降序排列后取前k个)。
cv2.drawMatches cv2.drawMatchsKnn:就像使用 cv2.drawKeypoints() 绘制关点一样我们可以使用 cv2.drawMatches()来绘制匹配的点。它会将两幅图像先水平排列然后在最佳匹配的点之间绘制直线从原图像到目标图像。如果前面使用的是BFMatcher.knnMatch()现在我们可以使用函数 cv2.drawMatchsKnn 为每个关键点和它的 k 个最佳匹配点绘制匹配线。如果 k 等于 2就会为每个关键点绘制两条最佳匹配直线。如果我们选择性绘制就给函数传入一个掩模。
对ORB描述符进行暴力匹配:
match=bf.match(des1,des2):返回值是一个DMatch对象列表。具有以下属性:
DMatch.distance - 描述符之间的距离。越小越好。
• DMatch.trainIdx - 目标图像中描述符的索引。
• DMatch.queryIdx - 查询图像中描述符的索引。
• DMatch.imgIdx - 目标图像的索引
对SIFT描述符进行暴力匹配:
FLANN匹配器:
cv2.FlannBasedMatcher( [, indexParams[, searchParams]] )
indexParams:
searchParams: