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的优点
-
速度:ORB算法的设计注重于处理速度,它能够在较短的时间内处理大量的图像数据,这使得ORB非常适合用于需要实时处理的应用场景,例如视频监控、机器人导航等。
-
尺度不变性:ORB算法能够在不同尺度的图像中检测到关键点,这意味着无论物体在图像中的大小如何变化,ORB都能够准确地识别出特征点。这种特性对于处理不同距离拍摄的图像或者图像缩放非常重要。
-
旋转不变性:ORB算法能够识别出关键点的方向,并对旋转进行校正,确保无论物体如何旋转,关键点都能被匹配和识别。这种特性对于处理从不同角度拍摄的图像非常关键。
-
无专利限制:与SIFT和SURF等算法不同,ORB算法没有专利限制,这意味着它可以在商业产品中自由使用,而无需支付任何版权费用。这使得ORB算法在商业应用中更具吸引力。
ORB的缺点
-
内存消耗:ORB算法在处理图像时,尤其是在处理大量关键点时,可能会消耗较多的内存资源。这是因为每个关键点都需要存储其位置、尺度、方向以及对应的BRIEF描述符。在内存资源受限的设备上,这可能成为一个问题。
-
特征表现力有限:ORB算法虽然能够提取图像中的关键点并生成描述符,但在某些情况下,它可能难以区分外观相似的特征。例如,在那些具有重复模式或缺乏显著纹理的区域,ORB可能无法提供足够的区分度,导致匹配错误或漏检。这在一些对特征描述能力要求较高的应用中可能成为限制因素。
针对这些缺点,研究人员和开发者可能需要考虑其他的特征检测和描述算法,或者对ORB算法进行改进,以适应特定的应用场景和需求。例如,可以通过优化算法来减少内存消耗,或者结合其他类型的描述符来提高特征的区分能力。此外,还可以通过数据增强和模型训练来提高ORB在复杂场景中的性能。
算法实现步骤
对象跟踪器的工作原理基于关键点的检测和描述符的匹配。这个过程可以通过以下步骤实现:
-
目标图像准备:首先,需要一个清晰的目标图像,这个图像应该只包含你想要跟踪的对象。例如,如果想跟踪一架飞机,应该选择一张只包含飞机的图像。
-
关键点和描述符提取:使用FAST算法在目标图像中识别关键点。这些关键点是图像中独特的位置,可以是角点、边缘或其他显著的特征点。然后,使用BRIEF算法为每个关键点生成一个简短的二进制描述符,这个描述符是对关键点周围区域的一种数字表示。
-
视频帧处理:在处理视频时,对于每一帧,重复关键点检测和描述符生成的过程。这样,就可以在每一帧中找到与目标图像相匹配的关键点。
-
描述符匹配:使用匹配算法(如暴力匹配或FLANN匹配器)将目标图像的关键点描述符与每一帧中提取的关键点描述符进行比较。如果找到匹配的描述符,这意味着在当前帧中找到了与目标图像相似的对象。
-
目标定位:一旦找到匹配的关键点,就可以根据这些关键点在当前帧中的位置绘制形状(如圆圈),从而实现对目标对象的跟踪。
OpenCV库可以方便地实现关键点检测、描述符生成和匹配。通过这种方式,可以创建一个定制的对象跟踪器,用于实时视频分析或任何需要对象跟踪的应用场景。
代码实现
在使用ORB算法进行对象检测或跟踪之前,确实需要考虑一些重要的因素,尤其是关于背景的选择和处理。ORB算法依赖于关键点的检测和描述,而这些关键点的准确性和数量会受到背景复杂度的显著影响。
-
背景清晰度:为了最大化ORB算法的性能,选择的背景应该是简单且清晰的,例如空旷的天空、单色墙壁或干净的道路。这样的背景可以减少无关关键点的数量,从而降低算法的计算负担。
-
避免复杂背景:如果背景中包含许多移动的物体,如行人、动物或其他动态元素,ORB算法可能会在这些区域检测到大量的关键点。这会导致算法效率降低,因为它需要处理和区分更多的关键点,从而影响处理速度和每秒帧数(FPS)。
-
实时应用的考量:对于需要实时处理的应用,如视频监控或机器人导航,速度和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算法实现目标追踪
概述 ORB(Oriented FAST and Rotated BRIEF)算法是高效的关键点检测和描述方法。它结合了FAST(Features from Accelerated Segment Test)算法的快速关键点检测能力和BRIEF(Binary Robust Independent Elementary Feat…...

13.JavaWeb XML:构建结构化数据的重要工具
目录 导语: 一、XML概念 (1)可拓展 (2)功能-存储数据 (3)xml与html的区别 二、XML内容 三、XML用途 四、案例:使用XML构建在线书店的书籍数据库 结语: 导语&…...

鸿蒙OS实战开发:【多设备自适应服务卡片】
介绍 服务卡片的布局和使用,其中卡片内容显示使用了一次开发,多端部署的能力实现多设备自适应。 用到了卡片扩展模块接口,[ohos.app.form.FormExtensionAbility] 。 卡片信息和状态等相关类型和枚举接口,[ohos.app.form.formInf…...

深度学习基础之一:机器学习
文章目录 深度学习基本概念(Basic concepts of deep learning)机器学习典型任务机器学习分类 模型训练的基本概念基本名词机器学习任务流程模型训练详细流程正、反向传播学习率Batch size激活函数激活函数 sigmoid 损失函数MSE & M交叉熵损失 优化器优化器 — 梯度下降优化…...

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果 一、简单介绍 二、简单指定视频某片段重复播放…...

ARXML处理 - C#的解析代码(二)
参数类 参数容器(ECUCPARAMCONFCONTAINERDEF)的PARAMETERS集合类由以下参数类实例构成。 枚举参数(ECUCENUMERATIONPARAMDEF ) 配置一个下拉选项,如PORT中一个pin可以配置SPI, CAN, PWM /// <remarks/>[Syste…...

关于华为即将举行的鸿蒙春季沟通会的新闻报道
华为计划在4月11日举办此次活动,届时将推出与车和PC类相关的新产品。尽管备受期待的华为P70系列设备的发布尚未得到官方确认,但已有多家媒体对此进行了报道。 文章中还提到了智界S7的新款可能在4月11日上市,并进行多项新功能升级。智界S7是去…...

MySQL视图及如何导入导出
1.视图 MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的࿰…...

文心一言上线声音定制功能;通义千问开源模型;openAI又侵权?
文心一言上线定制专属声音功能 百度旗下 AI 聊天机器人文心一言上线新功能,用户录音一句话,即可定制声音。 使用这项功能需要使用文心一言 App。在创建智能体中,点击创建自己的声音,朗读系统提示的一句话,等候几秒钟时…...

课时89:流程控制_函数进阶_函数变量
2.1.4 综合案例 这一节,我们从 信息采集、环境部署、小结 三个方面来学习。 信息采集 脚本实践-采集系统负载信息 查看脚本内容 [rootlocalhost ~]# cat function_systemctl_load.sh #!/bin/bash # 功能:采集系统负载信息 # 版本:v0.3 # …...

Linux命令-dpkg-preconfigure命令(Debian Linux中软件包安装之前询问问题)
说明 dpkg-preconfigure命令 用于在Debian Linux中软件包安装之前询问问题。 语法 dpkg-preconfigure(选项)(参数)选项 -f:选择使用的前端; -p:感兴趣的最低的优先级问题; --apt:在apt模式下运行。参数 软件包&am…...

SEO优化艺术:精细化技巧揭示与搜索引擎推广全面战略解读
SEO(搜索引擎优化,Search Engine Optimization)是一种网络营销策略,旨在通过改进网站内外的各项元素,提升网站在搜索引擎自然搜索结果中的排名,从而吸引更多目标用户访问网站,增加流量ÿ…...

《springcloud alibaba》 四 seata安装以及使用
目录 准备调整db配置准备创建数据库 seata配置nacos配置confi.txt下载向nacos推送配置的脚本 启动seata新建项目order-seata项目 订单项目数据库脚本pom.xmlapplication.yml启动类实体类dao类service类controller类feign类mapper类 stock-seata 库存项目数据库脚本pom.xmlappli…...

-bash: cd: /etc/hadoop: 没有那个文件或目录
解决办法:source /etc/profile 运行 source /etc/profile 命令会重新加载 /etc/profile 文件中的配置,这样做的目的是使任何更改立即生效,而不需要注销并重新登录用户。通常,/etc/profile 文件包含系统范围的全局 Shell 配置&…...

JVM字节码与类加载——字节码指令集与解析
文章目录 1、概述1.1、字节码与数据类型1.2、指令分类 2、加载与存储指令2.1、局部变量入栈指令2.2、常量入栈指令2.3、出栈装入局部变量表指令 3、算术指令3.1、彻底理解i与i3.2、比较指令 4、类型转换指令4.1、宽化类型转换4.2、窄化类型转换 5、对象、数组的创建与访问指令5…...

景芯2.5GHz A72训练营dummy添加(一)
景芯A72做完布局布线之后导出GDS,然后进行GDS merge,然后用Calibre对Layout添加Dummy。在28nm以及之前的工艺中,Dummy metal对Timing的影响不是很大,当然Star RC也提供了相应的解决方案,可以考虑Dummy metal来抽取RC。…...

React - 请你说一说setState是同步的还是异步的
难度级别:中高级及以上 提问概率:70% 在React项目中,使用setState可以更新状态数据,而不能直接使用为this.state赋值的方式。而为了避免重复更新state数据,React首先将state添加到状态队列中,此时我们可以通过shouldComponentUpdate这个钩…...

设计模式之命令模式(下)
2)完整解决方案 1.结构图 FBSettingWindow是“功能键设置”界面类,FunctionButton充当请求调用者,Command充当抽象命令类,MinimizeCommand和HelpCommand充当具体命令类,WindowHanlder和HelpHandler充当请求接收者。 …...

【opencv】示例-demhist.cpp 调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。...
#include "opencv2/core/utility.hpp" // 包含OpenCV核心工具库的头文件 #include "opencv2/imgproc.hpp" // 包含OpenCV图像处理的头文件 #include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编码解码的头文件 #include "opencv2/highgui…...

计算机网络---第三天
OSI参考模型与TCP/IP模型 参考模型产生背景: 背景:①兼容性较差,接口不统一 ②不利于排错与维护 ③设备成本高 参考模型概念: 概念:OSI参考模型定义了网络中设备所遵守的层次结构 参考模型优点: 优点…...

怎么防止文件被拷贝,复制别人拷贝电脑文件
怎么防止文件被拷贝,复制别人拷贝电,脑文件 防止文件被拷贝通常是为了保护敏感数据、知识产权或商业秘密不被未经授权的人员获取或传播。以下列出了一系列技术手段和策略,可以帮助您有效地防止文件被拷贝。 1. 终端管理软件: 如安企神、域智…...

流式密集视频字幕
流式密集视频字幕 摘要1 IntroductionRelated Work3 Streaming Dense Video Captioning Streaming Dense Video Captioning 摘要 对于一个密集视频字幕生成模型,预测在视频中时间上定位的字幕,理想情况下应该能够处理长的输入视频,预测丰富、…...

【教程】iOS Swift应用加固
🔒 保护您的iOS应用免受恶意攻击!在本篇博客中,我们将介绍如何使用HTTPCORE DES加密来加固您的应用程序,并优化其安全性。通过以下步骤,您可以确保您的应用在运行过程中不会遭受数据泄露和未授权访问的风险。 摘要 …...

新型基础设施建设(新基建)
新型基础设施建设(新基建)主要包括七个方面,即5G基站建设、特高压、城际高速铁路和城市轨道交通、新能源汽车充电桩、大数据中心、人工智能和工业互联网。 以下是新型基础设施的详细内容: 一、5G基站建设。5G网络的扩展和优化&a…...

蓝桥杯 第 9 场 小白入门赛 字符迁移
题目: 3.字符迁移【算法赛】 - 蓝桥云课 (lanqiao.cn) 思路: 此题通过把小写字母映射成数字,进行差分即可。 AC代码: #include<iostream> #include<cstring> #include<algorithm>using namespace std;typed…...

泰迪智能科技人工智能应用工程师(中级)特训营
随着人工智能技术的迅猛发展和应用的不断拓展,掌握人工智能技术已成为现代职业发展和企业创新的关键。为此,人工智能技能提升特训营应运而生,以全面、系统的课程设置,帮助学员深入掌握相关的理论知识,实践操作技能。特…...

【数据结构】考研真题攻克与重点知识点剖析 - 第 6 篇:图
前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…...

java的基本数据类型
在Java编程语言中,基本数据类型是构成Java程序的基础元素,它们用于存储简单值。Java的基本数据类型可以分为两大类:原始类型(Primitive Types)和引用类型(Reference Types)。原始类型包括整型、…...

0104练习与思考题-算法基础-算法导论第三版
2.3-1 归并示意图 问题:使用图2-4作为模型,说明归并排序再数组 A ( 3 , 41 , 52 , 26 , 38 , 57 , 9 , 49 ) A(3,41,52,26,38,57,9,49) A(3,41,52,26,38,57,9,49)上的操作。图示: tips::有不少在线算法可视化工具(软…...

烤羊肉串引来的思考--命令模式
1.1 吃羊肉串! 烧烤摊旁边等着拿肉串的人七嘴八舌地叫开了。场面有些混乱,由于人实在太多,烤羊肉串的老板已经分不清谁是谁,造成分发错误,收钱错误,烤肉质量不过关等。 外面打游击烤羊肉串和这种开门店做烤…...