OpenCV | 特征匹配

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

box.png

box_in_scene.png

python 复制代码
img1 = cv2.imread('box.png',0)
img2 = cv2.imread('box_in_scene.png',0)
python 复制代码
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
python 复制代码
cv_show('img1',img1)
python 复制代码
cv_show('img2',img2)
python 复制代码
sift = cv2.xfeatures2d.SIFT_create()
python 复制代码
kp1,des1 = sift.detectAndCompute(img1,None)
kp2,des2 = sift.detectAndCompute(img2,None)
python 复制代码
# crossCheck 表示两个特征点要互相匹配,例如A中的第i个特征点与B中的第j个特征点最近的,并且B中的第j个特征点到A中的第i个特征点也是
# NORM_L2 :归一化数组的(欧几里德距离),如果其他特征计算方法需要考虑不同的匹配计算方式
bf = cv2.BFMatcher(crossCheck=True)

1对1的匹配

python 复制代码
matches = bf.match(des1,des2)
matches = sorted(matches, key=lambda x: x.distance)
python 复制代码
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10],None,flags=2)
python 复制代码
cv_show('img3',img3)

输出结果:

k对最佳匹配

python 复制代码
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2,k=2)
python 复制代码
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])
python 复制代码
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
python 复制代码
cv_show('img3',img3)

输出结果:

ps:这里有一两个匹配点是错误的,还需要进一步的优化。

相关推荐
Henry-SAP12 小时前
SAP独立需求与相关需求的区别解析
人工智能·云原生·sap·erp
沫儿笙12 小时前
弧焊机器人智能节气阀
人工智能·机器人
小新科研测评12 小时前
2026 年 3 种 PDF 文献翻译方案横评:公式/表格/双栏排版保真度实测
人工智能·ai·pdf·自动翻译
xierui12312312 小时前
OpenAI 拟停止向 Cursor供模:如何设计不绑供应商的AIAgent架构
人工智能·系统架构·软件工程
workflower12 小时前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
deepdata_cn12 小时前
Qubit如何改变世界?密码、医药、AI 三大落地场景
人工智能·量子计算
亚远景aspice12 小时前
亚远景-ASPICE 与工具的结合:AI 原生工具链如何破解 ASPICE4.0 落地的效率困局
人工智能·aspice·过程管理
小程故事多_8012 小时前
突破多端研发效率瓶颈,ZSpec工作流的一人多端落地实践
人工智能
垂钓的小鱼112 小时前
物理 AI 的关键一环:Anthropic 把 MCP 搬进物理世界,拆解模型硬件标准 MHS,AI 操控显微镜、机械臂和量子激光的底层逻辑
人工智能
猎头南楼13 小时前
具身智能模型部署方向的能力要求与技术栈梳理
人工智能·深度学习·算法