如何使用ORB算法实现不同图像间的相同物体的特征匹配?(附源码)

本文介绍了如何使用ORB(Oriented FAST and Rotated BRIEF)特征点匹配进行图像识别。通过Python和OpenCV库,检测并匹配两张图片的特征点,展示了ORB在图像匹配中的效率和鲁棒性。ORB算法因其速度快、对图像变换有一定抵抗能力而被广泛应用。文章还探讨了ORB在分类检测和追踪任务中的潜在用途,指出其在计算量和训练量上的优势,以及可能牺牲的精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenCV杂谈_12


一. 需要做的前期准备
  1. 环境配置:
    Python版本:3.7
    功能包:opencv-python(3.4.2.16)
  2. 常识须知:
    ORB是什么?为什么要用ORB?
    ORB 是 Oriented Fast and Rotated Brief 的简称,可以用来对图像中的关键点快速创建特征向量,这些特征向量可以用来识别图像中的对象。ORB 的特点是速度非常快,而且在一定程度上不受噪点和图像变换的影响,例如旋转和缩放变换等。而且免费。
  3. 文件夹配置
    by demo
  4. 一个用的顺手的IDE(由于是Python项目,本人推荐Pycharm)
二. 源码如下:
import cv2

# 读取图片
img1 = cv2.imread("ImageQuery/JUMANJI.png", 0)  # 结尾加0直接将图片转化为灰色
img2 = cv2.imread("ImageTrain/2.png", 0)
# img2 = cv2.imread("ImageTrain/3.png", 0)  # 选择内容不同的图片时会发现可以匹配的点特别的少


# 使用ORB检测出特征点
orb = cv2.ORB_create(nfeatures=1000)  # nfeatures 代表着找到多少个特征点
kp1, des1 = orb.detectAndCompute(img1, None)  # kp : key points  des : descriptor  (key points:特征点在图像中的位置,有些特征点还具有朝向、大小等信息。 描述子:通常是一个向量,描述了该关键点周围像素的信息)
kp2, des2 = orb.detectAndCompute(img2, None)
# 绘制出检测得到的特征点
imgKp1 = cv2.drawKeypoints(img1, kp1, None)
imgKp2 = cv2.drawKeypoints(img2, kp2, None)

# match两张图片中的特征点
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

good = []
for m, n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])
print(len(good))  # 打印出匹配到了多少个特征点

# 在一张新的图片上展示match的结果
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)

# 展示结果
# cv2.imshow("kp1", imgKp1)
# cv2.imshow("kp2", imgKp2)
# cv2.imshow("img1", img1)
# cv2.imshow("img2", img2)
cv2.imshow("match", img3)

cv2.waitKey(0)
三. 结果展示

by demo

四. 感悟与分享
  1. Matching一直以来是计算机视觉的一大重要研究方向,其用途可以在高精度的基础上得到大大地延伸。
    比如:1. 分类检测任务:当你已经知道上图左半部分内容的分类属性是JUMANJI游戏光盘,那你完全可以根据其特征点的匹配情况,来判断另一个物体的分类属性是不是JUMANJI游戏光盘。这相比于使用基于深度学习的物体识别方法来说,具有更少的计算量、训练量,但也难免会降低一些精度和适用性。因此可以用在一些不需要大量样本的、较为单调的分类任务。2. 追踪任务:一般的追踪算法(比如Camshift算法)是通过提取目标的颜色特征能够有效地对视频中的运动目标进行持续跟踪,并且可以自动调节搜索窗大小,从而提高运动目标跟踪的准确性。但是,当背景与运动目标颜色相近或者背景复杂多变的情况下,很容易发生跟踪失败的情况,而此时就可以利用ORB算法找到在上一帧中跟踪失败的目标,然后再回到Camshift算法达到对目标连续跟踪的目的。
  2. 相关论文推荐:
    ORB算法论文原文:ORB: An efficient alternative to SIFT or SURF
    基于ORB算法的追踪实现:基于ORB特征点匹配的改进Camshift运动目标跟踪算法

如有问题,敬请指正。欢迎转载,但请注明出处。
Sandisk移动硬盘常见的写保护解除方法有:更改注册表项、更改物理保护开关、使用命令行工具等。 1. 更改注册表项: 步骤一:按下Win+R键,打开运行窗口,输入regedit,按回车键打开注册表编辑器。 步骤二:找到以下注册表项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies 步骤三:在右侧空白处,右键点击,选择新建DWORD值,将名称设为WriteProtect。 步骤四:双击WriteProtect,将数值数据改为0,点击确定。 步骤五:重启电脑,插入移动硬盘,检查写保护是否已解除。 2. 更改物理保护开关: 一些Sandisk移动硬盘有物理保护开关,移动保护开关或者物理保护开关可能使得Sandisk移动硬盘被锁死。因此,只需切换开关,就可以解除写保护。 3. 使用命令行工具: 步骤一:按下Win+R键,打开运行窗口,输入cmd,按回车键打开命令提示符。 步骤二:输入以下命令并按回车键执行: diskpart 步骤三:输入以下命令并按回车键执行: list volume 步骤四:找到Sandisk移动硬盘对应的磁盘,记录下编号,例如磁盘0。 步骤五:输入以下命令并按回车键执行: select disk 0 attributes disk clear readonly 步骤六:写保护已被成功解除。 以上是三种常见的Sandisk移动硬盘写保护解除的方法,如果以上方法无法解决问题,建议联系Sandisk客服或者专业维修服务商。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值