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

相关推荐
如若1235 分钟前
TRACER 论文解读与复现:面向 ICU 长时程患者监测的多模态 Harness 架构、时序证据建模与工具增强推理
人工智能·深度学习·计算机视觉
深蓝AI2 小时前
无头浏览器不必从 Chrome 改:Lightpanda 用 Zig 从零造,100 个页面只占 123MB 内存
人工智能·程序员
奈落244 小时前
AI辅助的另一面:从2026年国际AI安全报告的“故障”清单到国内专家的可靠性短板,自主行动的Agent为什么更难及时干预
人工智能·安全·agent·本地部署·ai 办公
火山引擎开发者社区6 小时前
eMudhra 证书失陷:容器用户最容易忽略的镜像信任链漏洞
人工智能
LabVIEW开发7 小时前
LabVIEW 机载 DIAL:每秒万次甲烷测量
人工智能·labview·labview知识·labview功能·labview程序
飞猫的边缘AI8 小时前
英特尔量子生意
人工智能·量子计算·边缘ai
深蓝AI8 小时前
桌面 Agent 缺的不是视觉:Vercel 开源 agent-desktop,用无障碍树 ref 替代截图坐标
人工智能·程序员
镜子AI8 小时前
镜子AI 技术复盘:三条自动化链路上的“停止条件“设计
运维·人工智能·自动化
向哆哆8 小时前
羊行为目标检测数据集:4类别、2,000张图像 | 目标检测
人工智能·yolo·目标检测·目标跟踪
如若1239 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python