栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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)

 一对一匹配

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版本的方法来实现。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272525.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号