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

2024-04-06 01:04

本文主要是介绍OpenCV图像处理——基于OpenCV的ORB算法实现目标追踪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

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() - t0avg_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 += 1cv2.imshow("coordinate_screen", frame)k = cv2.waitKey(5) & 0xFF# 画完矩形后按esc键退出if k == 27:cv2.destroyAllWindows()breakelse:break
cv2.destroyAllWindows()

在这里插入图片描述

这篇关于OpenCV图像处理——基于OpenCV的ORB算法实现目标追踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878623

相关文章

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

brew install opencv@2 时报错 Error: Can't create update lock in /usr/local/var/homebrew/locks!

解决方案,报错里已经说明了: 我的解决方案: sudo chown -R "$USER":admin /usr/local   stackoverflow上的答案 I was able to solve the problem by using chown on the folder: sudo chown -R "$USER":admin /usr/local Also you'

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例: #include <stdio.h>// DALIN PID 结构体定义typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivative; // 微分flo

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围 [0, 100] 内 -100 <= Node.

【Java算法】滑动窗口 下

​ ​    🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🦌一.水果成篮 题目链接:904.水果成篮 ​ 算法原理 算法原理是使用“滑动窗口”(Sliding Window)策略,结合哈希表(Map)来高效地统计窗口内不同水果的种类数量。以下是详细分析: 初始化:创建一个空的哈希表 map 用来存储每种水果的数量,初始化左右指针 left

ROS2从入门到精通4-4:局部控制插件开发案例(以PID算法为例)

目录 0 专栏介绍1 控制插件编写模板1.1 构造控制插件类1.2 注册并导出插件1.3 编译与使用插件 2 基于PID的路径跟踪原理3 控制插件开发案例(PID算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情:《ROS2从入门到精通》 1 控制插

算法与数据结构面试宝典——回溯算法详解(C#,C++)

文章目录 1. 回溯算法的定义及应用场景2. 回溯算法的基本思想3. 递推关系式与回溯算法的建立4. 状态转移方法5. 边界条件与结束条件6. 算法的具体实现过程7. 回溯算法在C#,C++中的实际应用案例C#示例C++示例 8. 总结回溯算法的主要特点与应用价值 回溯算法是一种通过尝试各种可能的组合来找到所有解的算法。这种算法通常用于解决组合问题,如排列、组合、棋盘游

《学习OpenCV》课后习题解答7

题目:(P105) 创建一个结构,结构中包含一个整数,一个CvPoint和一个 CvRect;称结构体为“my_struct”。 a. 写两个函数:void Write_my_strct(CvFileStorage* fs, const char * name, my_struct* ms) 和 void read_my_struct(CvFileStorage* fs, CvFileNode