Brute-Force蛮力匹配
# 读入图像
img1 = cv2.imread('E:AnacondaAnaconda3.8Hiacut.jpg',0)
img2 = cv2.imread('E:AnacondaAnaconda3.8Hia.jpg',0)
def cv_show(name,img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
sift = cv2.xfeatures2d.SIFT_create() #SIFT特征算法实例化
#计算特征
kp1,des1 = sift.detectAndCompute(img1, None)#检测关键点与关键点特征向量计算二合一:kp为关键点,des为关键点特征向量
kp2,des2 = sift.detectAndCompute(img2, None)
crossCheck表示两个特征点要相互匹配,例如A的第i个特征点与B的第j个特征点最接近,并且B中的第j个特征点到A中的第i个特征点也是
NORM_L2:归一化数组的(欧几里得距离),如果其他的特征计算方法需要考虑不同的匹配计算公式。
bf = cv2.BFMatcher(crossCheck=True)
NORM_L2:归一化数组的(欧几里得距离),如果其他的特征计算方法需要考虑不同的匹配计算公式。
bf = cv2.BFMatcher(crossCheck=True)
一对一匹配
matches = bf.match(des1,des2)#传入两个点的特征向量 matches = sorted(matches, key = lambda x:x.distance)#对所有的结果进行排序,最接近,第二接近。。。 img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:50], None, flags = 2)
得到的结构如下图所示:
k对最佳匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)#规定可以匹配两个关键点
good = []#进行一次筛选
for m,n in matches:#m,n分别为特征点到两个匹配点的距离
if m.distance <0.75* n.distance:#如果m/n小于0.75的话,则保留结果,0.75可调,根据具体实战情况而额定
good.append([m])#保留合适项
进行合适的项的保留之后,我们通过随机抽样一致算法(RANSAC)过滤掉一些错误的匹配结果
#选择初始样本点进行拟合,给定一个容忍范围,不断进行迭代 #每一次拟合后,容差范围内都有对应的数据点,找出数据点最多的情况,就是最终的拟合结果 #提取图像特征点,至少四个 #将两块拼在一起
之后进行如下操作:
import cv2
from cv2 import Stitcher
from matplotlib import pyplot as plt
imageA = cv2.imread('E:AnacondaAnaconda3.8TZJiu1.jpg')
imageB = cv2.imread('E:AnacondaAnaconda3.8TZJ2.jpg')
# 把图像拼接成全景图
stitcher = Stitcher()
(result, vis) = stitcher.stitch([imageA, imageB], showMatches=True)
# 显示所有图片
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里可能存在stitch函数的版权问题,大家可以通过降低opencv版本的方法来实现。



