Opencv第十八章 高级篇之图像模板匹配算法

Brute-Force蛮力匹配

# 读入图像
img1 = cv2.imread('E:\Anaconda\Anaconda3.8\Hiacut.jpg',0)
img2 = cv2.imread('E:\Anaconda\Anaconda3.8\Hia.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)

 一对一匹配

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)

得到的结构如下图所示:

Opencv第十八章 高级篇之图像模板匹配算法_第1张图片

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:\Anaconda\Anaconda3.8\TZJiu1.jpg')
imageB = cv2.imread('E:\Anaconda\Anaconda3.8\TZJ2.jpg')

# 把图像拼接成全景图
stitcher = Stitcher()
(result, vis) = stitcher.stitch([imageA, imageB], showMatches=True)

# 显示所有图片
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里可能存在stitch函数的版权问题,大家可以通过降低opencv版本的方法来实现。

你可能感兴趣的:(opencv,算法,python)