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:这里有一两个匹配点是错误的,还需要进一步的优化。

相关推荐
Sui_Network1 分钟前
智能体支付时代:Sui 为 AI 构建可验证的金融基础设施
大数据·人工智能·游戏·金融·rpc·区块链·量子计算
Goboy2 分钟前
如果2025的我是强化学习,那最终奖励会是什么?
人工智能·程序员·trae
微爱帮监所写信寄信3 分钟前
微爱帮监狱寄信写信工具用户头像安全审核体系
人工智能
熬夜敲代码的小N4 分钟前
AI文本分类实战:从数据预处理到模型部署全流程解析
人工智能·分类·数据挖掘
沛沛老爹4 分钟前
Web开发者快速上手AI Agent:Dify本地化部署与提示词优化实战
前端·人工智能·rag·faq·文档细粒度
国科安芯4 分钟前
低轨卫星边缘计算节点的抗辐照MCU选型分析
人工智能·单片机·嵌入式硬件·架构·边缘计算·安全威胁分析·安全性测试
美团技术团队5 分钟前
2025 美团技术团队热门技术文章汇总
人工智能
GEO AI搜索优化助手6 分钟前
生成式AI搜索的跨行业革命与商业模式重构
大数据·人工智能·搜索引擎·重构·生成式引擎优化·ai优化·geo搜索优化
张拭心11 分钟前
"氛围编程"程序员被解雇了
android·前端·人工智能
我是人机不吃鸭梨16 分钟前
Flutter AI 集成革命(2025版):从 Gemini 模型到智能表单验证器的终极方案
开发语言·javascript·人工智能·flutter·microsoft·架构