展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

特征匹配

  • 案例1
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
img1 = cv2.imread('01_Picture/19_Box.png',0)
img2 = cv2.imread('01_Picture/20_Box_in_scene.png',0)
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv_show('img1',img1)
cv_show('img2',img2)
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# crossCheck 表示两个特征点要互相匹配,例如 A 中的第 i 个特征点与 B 中第 j 个特征点最近的,并且 B 中第 j 个特征点到 A 中的第 i 个特征点也是最近的。
# 将两幅图像的特征点、特征向量算出来,用欧氏距离去比较特征向量相似性,一般情况下默认用的是归一化后的欧式距离去做,为了使得结果更均衡些。
# 如果不用 sift 特征计算方法去做,而是用其他特征计算方法需要考虑不同的匹配方式。
bf = cv2.BFMatcher(crossCheck = True) # cv2.BFMatcher 蛮力匹配缩写
# 1对1匹配
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2) # 画前十个点
cv_show('img3',img3)
  • 执行结果
点击查看详情

  • k对最佳匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2) # k 参数可选,可以一个点跟它最近的k个点可选
good = []
for m,n in matches:
if m.distance < 0.75 * n.distance: # m.distance 与 n.distance 比值小于 0.75,这是自己设定的过滤条件
good.append([m])
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)
cv_show('img3',img3)
  • 执行结果
点击查看详情

  • 随机抽样一致算法(RANSAC)
点击查看详情
  • 给定一个容忍范围,不断进行迭代

  • 每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果

posted @   DogLeftover  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示