ORB特征简述

目录

一、前言

二、实现步骤:

三、优缺点

四、应用领域

五、代码实现

六、运行结果


一、前言

当涉及计算机视觉和图像处理时,特征提取是一项至关重要的任务。特征提取允许计算机理解和识别图像中的关键信息,如边缘、角点、纹理等。ORB(Oriented FAST and Rotated BRIEF)是一种强大的特征提取和描述算法,它结合了FAST(Features from Accelerated Segment Test)关键点检测BRIEF(Binary Robust Independent Elementary Features)特征描述符的算法

二、实现步骤:

  1. FAST关键点检测:FAST是一种高效的关键点检测算法。它通过比较像素点的强度来检测关键点,而不需要在多个尺度上执行耗时的操作。FAST算法通过检测像素点周围的16个像素是否明显比中心像素点亮或暗来确定关键点的位置。这使得FAST非常快速,能够快速地找到具有显著强度变化的图像区域。

  2. 关键点方向分配:与一些其他特征描述算法不同,ORB能够计算关键点的方向。通过在关键点周围的像素点中找到梯度方向,ORB可以确定关键点的主要方向。这使得ORB具有旋转不变性,即使图像在某种程度上旋转了,ORB特征仍然能够正确匹配。

  3. BRIEF特征描述符:一旦确定了关键点和其方向,接下来是生成描述符。ORB使用BRIEF描述符生成二进制描述符。BRIEF通过在关键点周围的像素点上执行二进制比较来生成描述符,这些比较构成了一个二进制字符串,表示关键点周围的特征。

  4. 关键点匹配:生成的ORB描述符可以用于匹配不同图像中的关键点。这对于图像匹配、物体识别和SLAM等任务非常有用。

三、优缺点

优点:

  • 速度快:由于结合了FAST检测和BRIEF描述符,ORB特征在速度上表现出色。
  • 旋转不变性:ORB能够处理图像的旋转,这对于许多实际应用非常重要。
  • 开源:ORB是一个开源算法,可以轻松地在各种平台和编程语言中使用。

缺点:

  • 尺度不变性有限:与一些其他特征描述符相比,ORB的尺度不变性有一定限制。
  • 对光照变化敏感:像许多特征描述符一样,ORB对光照变化敏感。

四、应用领域

  1. 图像拼接:在图像拼接中,ORB特征可用于检测和匹配图像中的特征点,以将多幅图像拼接成一个更大的图像。这在全景图像的创建中非常有用。

  2. 目标识别:ORB特征在目标识别任务中非常有用。通过在目标图像和输入图像中检测和匹配ORB特征,可以实现物体检测和跟踪。

  3. SLAM:在SLAM系统中(Simultaneous Localization and Mapping),ORB特征可用于构建地图和同时确定相机的位置。它在机器人导航和自动驾驶中扮演着关键角色。

  4. 图像检索:ORB特征还可以用于图像检索任务,通过将图像中的ORB特征与数据库中的特征进行匹配,可以找到与输入图像相似的图像。

五、代码实现

import cv2
import numpy as np
import sys
def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)

def detectAndDescribe(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 将彩色图片转换成灰度图
    descriptor = cv2.ORB_create()  # 建立ORB生成器
    # 检测ORB特征点,并计算描述符
    (kps, des) = descriptor.detectAndCompute(image, None)

    kps_float = np.float32([kp.pt for kp in kps])  # 将结果转换成NumPy数组
    return (kps, kps_float, des)  # 返回特征点集,及对应的描述特征

'''读取拼接图片'''
imageA = cv2.imread("1.jpg")
cv_show('imageA', imageA)
imageB = cv2.imread("2.jpg")
cv_show('imageB', imageB)

'''计算图片特征点及描述符'''
(kpsA, kps_floatA, desA) = detectAndDescribe(imageA)
(kpsB, kps_floatB, desB) = detectAndDescribe(imageB)

'''建立暴力匹配器BFMatcher,在匹配大型训练集合时使用FlannBasedMatcher速度更快。'''
matcher = cv2.BFMatcher()

rawMatches = matcher.knnMatch(desB, desA, 2)
good = []
matches = []
for m in rawMatches:
    # 当最近距离跟次近距离的比值小于0.85值时,保留此匹配对
    if len(m) == 2 and m[0].distance < 0.65 * m[1].distance:
        good.append(m)
        # 存储两个点在featuresA, featuresB中的索引值
        matches.append((m[0].trainIdx, m[0].queryIdx))

vis = cv2.drawMatchesKnn(imageB, kpsB, imageA, kpsA, good, None)
cv_show("Keypoint Matches", vis)

六、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值