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)
得到的结构如下图所示:
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 pltimageA = 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版本的方法来实现。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!