特征匹配
- 案例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)
点击查看详情
-
给定一个容忍范围,不断进行迭代
-
每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App