我前面的帖子有写ubuntu和windows下opencv环境搭建
特征检测
1.特征点最好是选择角点(Harris)
2.什么是角点?①在特征中最重要的是角点;②灰度梯度的最大值对应的像素;③两条线的角点;④极值点(一阶导数最大值,二阶导数为0)
Harris角点检测
①光滑地区,平坦且没有参照物,衡量系数不变;②边沿地区,延马路走中心点不变,横穿马路中心点变化,衡量系数变化剧烈;③在交点处,衡量系数都变化剧烈。
API:dst = cv2.cornerHarris(img,dst,blockSize,ksize,k)
角点检测的是灰度图:gray = cv2.cvtColor(img,cv2.BG2GRAY)
Shi-Tomasi角点检测
①是Harris角点检测的改进;②Harris角点检测的稳定性和k值有关,而k是个经验值
goodFeaturesToTrack(img,maxCorners,...)
maxCorners:角点的最大值,0表示无限制
qualityLevel:小于1.0的正数,一般为0.01~0.1
minDistance:角之间最小欧式距离,忽略小于此距离的点
mask:感兴趣的区域
blockSize:检测窗口
useHarrisDetector:是否使用Harris算法
k:默认0.04
SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)
Harris角点具有旋转不变的特性;但缩放后,原来的角点可能就不是角点了
kp=sift.detect(img, ...)
drawKeypoints(gray,kp,img)
计算SIFT描述子
关键点:位置,大小和方向
关键点描述子:记录了关键点周围对其有贡献的像素点的一组向量值,其不受仿射变换、光照变换等影响。
计算描述子:kp,des=sift.computer(img,kp),用于特征匹配
同时计算关键点和描述:kp,des=sift.detectAndComputer(img, ...)
mask:指明对img中哪个区域进行计算
SURF(Speed-Up Robost Features)加速鲁棒性特征检测
SIFT优点是检测准确,缺点是检测速度慢,所以有SURF
创建对象:surf=cv2.xfeatures2d.SURF_create()
kp,des=surf.detectAndComputer(img,mask)
最新版的opencv里面已经没有SURF库,要么就不用这个检测方法,要么就重新安装老版opencv
△ORB(Oriented FAST and Rotated BRIEF)
ORB - (Oriented Fast and Rotated BRIEF)算法_orb算法-CSDN博客
可以做到实时检测;ORB=Oriented FAST + Rotated BRIEF(特征点检测+描述子计算)
【特征检测】FAST特征点检测算法_fast特征检测-CSDN博客
BRIEF特征点描述算法详解_brief特征描述-CSDN博客
orb=cv2.ORB_create()
kp,des=orb.detectAndComputer(img,mask)——img是灰度化以后的图像
特征匹配方法
BF(Brute-Force),暴力特征匹配方法
FLANN 最快邻近区域特征匹配方法
暴力特征匹配原理
使用第一组中的每个特征的描述子与第二组中的所有特征描述子进行匹配,计算它们的差距,然后将最接近一个匹配返回。
① 创建匹配器 BFMatcher(normType,crossCheck)
normType:NORM_L1,NORM_L2,HANMING1, ....(默认NORM_L2)
② 进行特征匹配 bf.matcxh(des1,des2)
match:参数为SIFT、SURF、ORB等计算的描述子,对两幅图的描述子进行计算
③ 绘制匹配点 cv2.drawMatches(img1,kp1,img2k....)
搜索img,kp
匹配图img,kp
match()方法返回的匹配结果
△FLANN特征匹配
速度快,但是准确性不高
① 创建FLANN匹配器 FlannBasedMatcher()
index_params字典:匹配算法KDTREE、LSH(ORB)
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
FLANN_INDEX_KDTREE=1, trees=5为经验值
② 进行特征匹配 flann.match/knnMatch()
参数为SIFT/SURF/ORB等计算的描述子
k表示取欧式距离最近的前k个关键点
返回的是匹配的结果DMatch的对象:
distance:描述子之间的距离;queryIdx:第一个图像的描述子索引值;trainIdx:第二个图像的描述子索引值;imgIdx:第二个图的索引值
③ 绘制匹配点 cv2.drawMatches/drawMatchesKnn()
drawMatchesKnn():搜索img,kp;匹配图img,kp;match()方法返回的匹配结果
图像查找
特征匹配+单应性矩阵+透视变换
cv2.findHomography(srcPts, dstPts, cv2.RANSAC, 5.0)
5.0:阈值,经验值
透视变换:cv2.perspectiveTransform(pts, H)
将查找的图像框起来:cv2.polyline()
图像拼接
①读取文件并重置尺寸;
②根据特征点和描述子,计算得到单应性矩阵;
③图像变化;
④图像拼接并输出结果
找到拼接处,像素相加求平均,再替换原来的图片;裁剪周围黑边