OpenCV图像处理——基于OpenCV的ORB算法实现目标追踪

news2024/10/7 10:20:10

概述

ORB(Oriented FAST and Rotated BRIEF)算法是高效的关键点检测和描述方法。它结合了FAST(Features from Accelerated Segment Test)算法的快速关键点检测能力和BRIEF(Binary Robust Independent Elementary Features)算法的征描述能力,使得ORB在处理图像时既快速又准确。

关键点检测是图像处理中的一个重要步骤,它涉及到在图像中寻找那些具有独特特征的点,这些点通常是图像中的重要部分,如角点、边缘等。这些点因其在图像中的位置和外观特征,可以被用来进行图像的匹配、识别和跟踪等任务。

特征描述符则是用来描述关键点周围区域的一种方式,它提供了关键点周围像素的详细信息。一个好的特征描述符应该对图像的旋转、尺度变化和噪声具有鲁棒性,这样才能在不同的图像中准确地匹配到相同的关键点。

FAST算法是一种角点检测算法,它通过检查图像中的每个像素点,来确定是否存在一个亮度变化显著的角点。FAST算法的优点是计算速度快,能够在图像中快速找到大量的潜在关键点。

BRIEF算法则是一种二进制特征描述符,它通过比较关键点周围的像素与关键点本身的亮度关系,生成一个二进制字符串来表示关键点的特征。这个二进制字符串是对关键点周围区域的一种紧凑而有效的描述,它对于图像的匹配和识别非常有用。

ORB算法通过结合FAST和BRIEF两种算法的优点,能够在图像中快速准确地检测到关键点,并生成对应的特征描述符。这使得ORB算法非常适合用于对象识别、跟踪和图像拼接等任务,尤其是在需要处理大量图像数据时,ORB的高效性尤为重要。
在这里插入图片描述

ORB的优点

  1. 速度:ORB算法的设计注重于处理速度,它能够在较短的时间内处理大量的图像数据,这使得ORB非常适合用于需要实时处理的应用场景,例如视频监控、机器人导航等。

  2. 尺度不变性:ORB算法能够在不同尺度的图像中检测到关键点,这意味着无论物体在图像中的大小如何变化,ORB都能够准确地识别出特征点。这种特性对于处理不同距离拍摄的图像或者图像缩放非常重要。

  3. 旋转不变性:ORB算法能够识别出关键点的方向,并对旋转进行校正,确保无论物体如何旋转,关键点都能被匹配和识别。这种特性对于处理从不同角度拍摄的图像非常关键。

  4. 无专利限制:与SIFT和SURF等算法不同,ORB算法没有专利限制,这意味着它可以在商业产品中自由使用,而无需支付任何版权费用。这使得ORB算法在商业应用中更具吸引力。

ORB的缺点

  1. 内存消耗:ORB算法在处理图像时,尤其是在处理大量关键点时,可能会消耗较多的内存资源。这是因为每个关键点都需要存储其位置、尺度、方向以及对应的BRIEF描述符。在内存资源受限的设备上,这可能成为一个问题。

  2. 特征表现力有限:ORB算法虽然能够提取图像中的关键点并生成描述符,但在某些情况下,它可能难以区分外观相似的特征。例如,在那些具有重复模式或缺乏显著纹理的区域,ORB可能无法提供足够的区分度,导致匹配错误或漏检。这在一些对特征描述能力要求较高的应用中可能成为限制因素。

针对这些缺点,研究人员和开发者可能需要考虑其他的特征检测和描述算法,或者对ORB算法进行改进,以适应特定的应用场景和需求。例如,可以通过优化算法来减少内存消耗,或者结合其他类型的描述符来提高特征的区分能力。此外,还可以通过数据增强和模型训练来提高ORB在复杂场景中的性能。

算法实现步骤

对象跟踪器的工作原理基于关键点的检测和描述符的匹配。这个过程可以通过以下步骤实现:

  1. 目标图像准备:首先,需要一个清晰的目标图像,这个图像应该只包含你想要跟踪的对象。例如,如果想跟踪一架飞机,应该选择一张只包含飞机的图像。

  2. 关键点和描述符提取:使用FAST算法在目标图像中识别关键点。这些关键点是图像中独特的位置,可以是角点、边缘或其他显著的特征点。然后,使用BRIEF算法为每个关键点生成一个简短的二进制描述符,这个描述符是对关键点周围区域的一种数字表示。

  3. 视频帧处理:在处理视频时,对于每一帧,重复关键点检测和描述符生成的过程。这样,就可以在每一帧中找到与目标图像相匹配的关键点。

  4. 描述符匹配:使用匹配算法(如暴力匹配或FLANN匹配器)将目标图像的关键点描述符与每一帧中提取的关键点描述符进行比较。如果找到匹配的描述符,这意味着在当前帧中找到了与目标图像相似的对象。

  5. 目标定位:一旦找到匹配的关键点,就可以根据这些关键点在当前帧中的位置绘制形状(如圆圈),从而实现对目标对象的跟踪。

OpenCV库可以方便地实现关键点检测、描述符生成和匹配。通过这种方式,可以创建一个定制的对象跟踪器,用于实时视频分析或任何需要对象跟踪的应用场景。

代码实现

在使用ORB算法进行对象检测或跟踪之前,确实需要考虑一些重要的因素,尤其是关于背景的选择和处理。ORB算法依赖于关键点的检测和描述,而这些关键点的准确性和数量会受到背景复杂度的显著影响。

  1. 背景清晰度:为了最大化ORB算法的性能,选择的背景应该是简单且清晰的,例如空旷的天空、单色墙壁或干净的道路。这样的背景可以减少无关关键点的数量,从而降低算法的计算负担。

  2. 避免复杂背景:如果背景中包含许多移动的物体,如行人、动物或其他动态元素,ORB算法可能会在这些区域检测到大量的关键点。这会导致算法效率降低,因为它需要处理和区分更多的关键点,从而影响处理速度和每秒帧数(FPS)。

  3. 实时应用的考量:对于需要实时处理的应用,如视频监控或机器人导航,速度和FPS是至关重要的。如果背景过于复杂,ORB算法可能无法在有限的时间内完成关键点的检测和匹配,这会导致实时性能不足。

在部署ORB算法之前,应该仔细考虑和评估应用场景的背景复杂度。也可以通过预处理步骤来简化背景,例如通过滤波或分割技术来移除或抑制背景中的噪声和干扰。这样可以提高ORB算法的性能,使其更适合于实时或高性能的应用需求。

代码实现:

import cv2
import matplotlib.pyplot as plt
import numpy as np
import time

# 这是目标图像
image = cv2.imread("helicopter_roi.png")
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(rgb_image)

# 初始化ORB
orb = cv2.ORB_create()

# 使用ORB检测关键点
keypoints_1, descriptors_1 = orb.detectAndCompute(gray_image, None)

# 仅绘制关键点位置,不包括大小和方向
img2 = cv2.drawKeypoints(rgb_image, keypoints, None, color=(0, 255, 0), flags=0)
plt.imshow(img2)

# 视频路径
video_path = "helicopter_2.mp4"
video = cv2.VideoCapture(video_path)

# 初始化FPS计算变量
t0 = time.time()
n_frames = 0

# 初始化orb
orb = cv2.ORB_create()

# 匹配器对象
bf = cv2.BFMatcher()

while True:
    # 读取视频
    ret, frame = video.read()
    if ret:
        # 转换为灰度图像
        frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 使用BRIEF计算描述符
        keypoints_2, descriptors_2 = orb.detectAndCompute(frame_gray, None)

        """比较从第一帧(目标对象)提取的关键点/描述符与当前帧提取的关键点/描述符。
        """
        matches = bf.match(descriptors_1, descriptors_2)

        for match in matches:
            # queryIdx给出目标图像的关键点索引
            query_idx = match.queryIdx
            # .trainIdx给出当前帧的关键点索引
            train_idx = match.trainIdx
            # 取匹配的坐标
            pt1 = keypoints_1[query_idx].pt
            # 当前帧关键点坐标
            pt2 = keypoints_2[train_idx].pt
            # 在pt2坐标处画圆圈,因为pt2给出当前帧坐标
            cv2.circle(frame, (int(pt2[0]), int(pt2[1])), 2, (255, 0, 0), 2)

        elapsed_time = time.time() - t0
        avg_fps = (n_frames / elapsed_time)
        print("Average FPS: " + str(avg_fps))
        cv2.putText(frame, str(avg_fps), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 1, cv2.LINE_AA)
        n_frames += 1
        cv2.imshow("coordinate_screen", frame)
        k = cv2.waitKey(5) & 0xFF
        # 画完矩形后按esc键退出
        if k == 27:
            cv2.destroyAllWindows()
            break
    else:
        break
cv2.destroyAllWindows()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

期货量化交易软件:MQL5 中的范畴论 (第 15 部分)函子与图论

概述 在上一篇文章中,我们目睹了前期文章中涵盖的概念(如线性序)如何视作范畴,以及为什么它们的“态射”在与其它范畴相关时即构成函子。在本文中,我们赫兹量化软件将阐述来自前期文章中的概括,即通过查看…

DXP学习002-PCB编辑器的环境参数及电路板参数相关设置

目录 一,dxp的pcb编辑器环境 1,创建新的PCB设计文档 2,PCB编辑器界面 1)布线工具栏 2)公用工具栏 3)层标签栏 ​编辑 3,PCB设计面板 1)打开pcb设计面板 4,PCB观…

SSH如何端口映射?

SSH端口映射(SSH Port Forwarding)是一种通过SSH协议进行端口转发的技术,它能够实现在不直接将服务暴露在公网的情况下,通过私有通道传输数据,并保障数据的安全加密。 SSH端口映射的原理 SSH端口映射主要包括本地端口…

二维码门楼牌管理应用平台建设:智慧化管理的新篇章

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、二维码门楼牌管理应用平台的功能特点三、二维码门楼牌管理应用平台的意义与价值四、结语 前言 随着信息技术的不断发展,二维码门楼牌管理应用平台的建设已成为城市管理的必然趋势。通过这一平台&#xff0…

稀碎从零算法笔记Day42-LeetCode:分发糖果

题型:数组、贪心 链接: 来源:LeetCode 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更…

绝地求生:齐贺PUBG七周年!分享你的游玩感受及反馈赢惊喜道具

PUBG七周年庆典火热进行中,特殊道具、周年主题艾伦格上线!七周年期间游玩PUBG,在评论区分享你的游玩感受及反馈,即可参与活动赢取夏日浪潮宝箱奖励。 参与方式 齐贺PUBG七周年!在评论区分享分享你的七周年游玩感受及反…

查看MySQL版本的方式

文章目录 一、使用cmd输入命令行查看二、在mysql客户端服务器里查询 一、使用cmd输入命令行查看 1、打开 cmd ,输入命令行: mysql --version 2、还是打开cmd,输入命令行:mysql -V (注意了,此时的V是个大写的V) 二、…

5.网络编程-socker(golang版)

目录 一、什么是socket? 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包,拆包 1.什么是粘包,拆包? 2.为什么UDP没有粘包,拆包? 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …

RocketMQ 之 IoT 消息解析:物联网需要什么样的消息技术?

作者:林清山(隆基) 前言: 从初代开源消息队列崛起,到 PC 互联网、移动互联网爆发式发展,再到如今 IoT、云计算、云原生引领了新的技术趋势,消息中间件的发展已经走过了 30 多个年头。 目前&a…

整理的微信小程序日历(单选/多选/筛选)

一、日历横向多选&#xff0c;支持单日、双日、三日、工作日等选择 效果图 wxml文件 <view class"calendar"><view class"section"><view class"title flex-box"><button bindtap"past">上一页</button&…

00-JAVA基础-JVM类加载机制及自定义类加载器

JVM 类加载机制 JVM类加载机制是Java运行时环境的核心部分&#xff0c;它负责将类的.class文件加载到JVM中&#xff0c;并将其转换为可以被JVM执行的数据结构。 类加载的整体流程 类加载的整体流程可以分为五个阶段&#xff1a;加载&#xff08;Loading&#xff09;、链接&a…

java数据结构与算法刷题-----LeetCode238. 除自身以外数组的乘积

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 动态规划&#xff1a;左右乘积列表2. 滚动数组对动态规划过程…

flutter组件_AlertDialog

官方说明&#xff1a;A Material Design alert dialog. 翻译&#xff1a;一个材料设计警告对话框。 作者释义&#xff1a;显示弹窗&#xff0c;类似于element ui中的Dialog组件。 AlertDialog的定义 const AlertDialog({super.key,this.icon,this.iconPadding,this.iconColor,t…

Cortex-M4架构

第一章 嵌入式系统概论 1.1 嵌入式系统概念 用于控制、监视或者辅助操作机器和设备的装置&#xff0c;是一种专用计算机系统。 更宽泛的定义&#xff1a;是在产品内部&#xff0c;具有特定功能的计算机系统。 1.2 嵌入式系统组成 硬件 ①处理器&#xff1a;CPU ②存储器…

分布式事务 - 个人笔记 @by_TWJ

目录 1. 传统事务1.1. 事务特征1.2. 事务隔离级别1.2.1. 表格展示1.2.2. oracle和mysql可支持的事务隔离级别 2. 分布式事务2.1. CAP指标2.2. BASE理论2.3. 7种常见的分布式事务方案2.3.1. 2PC2.3.2. 3PC2.3.3. TCC2.3.3.1. TCC的注意事项&#xff1a;2.3.3.2. TCC方案的优缺点…

【Java面试题】JVM(26道)

文章目录 JVM面试题基础1.什么是JVM&#xff1f;2.JVM的组织架构&#xff1f; 内存管理3.JVM的内存区域是什么&#xff1f;3.1堆3.2方法区3.3程序计数器3.4Java虚拟机栈3.5本地方法栈 4.堆和栈的区别是什么&#xff1f;5.JDK1.6、1.7、1.8内存区域的变化&#xff1f;6.内存泄露…

mynet开源库

1.介绍 个人实现的c开源网络库&#xff0e; 2.软件架构 1.结构图 2.基于event的自动分发机制 3.多优先级分发队列&#xff0c;延迟分发队列 内部event服务于通知机制的优先级为0&#xff0c;外部event优先级为1&#xff0e; 当集中处理分发的event_callback时&#xff0c…

鸿蒙ArkUI声明式学习:【UI资源管理】

OpenHarmony 应用的资源分类和资源的访问以及应用开发使用的像素单位以及各单位之间相互转换的方法。 资源分类 移动端应用开发常用到的资源比如图片&#xff0c;音视频&#xff0c;字符串等都有固定的存放目录&#xff0c;OpenHarmony 把这些应用的资源文件统一放在 resourc…

线程的666种状态

文章目录 在Java中&#xff0c;线程有以下六种状态&#xff1a; NEW&#xff1a;新建状态&#xff0c;表示线程对象已经被创建但还未启动。RUNNABLE&#xff1a;可运行状态&#xff0c;表示线程处于就绪状态&#xff0c;等待系统分配CPU资源执行。BLOCKED&#xff1a;阻塞状态…

Centos Docker Oracle11g 密码过期修改

症状&#xff1a; Centos Oracle11g环境变量配置 如果没有配置环境变量&#xff0c;需要先配置Oracle环境变量&#xff0c;否则执行sqlplus时会提示&#xff1a;SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory 配置方法&#xff1a; 第一步&a…