OpenCV视觉分析之目标跟踪(12)找到局部的最大值函数meanShift()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
在反向投影图像上找到一个对象。
meanShift 是一种用于图像处理和计算机视觉领域的算法,特别适用于目标跟踪、图像分割等任务。该算法基于一个简单的概念:通过迭代地移动窗口到更高密度的区域,直到找到局部的最大值(即密度最高的点)。在图像处理中,这个“密度”通常指的是像素颜色或特征空间中的分布。
基本原理
- 颜色空间中的应用:在颜色空间中,每个像素可以被视为一个点,这些点具有特定的颜色值。对于给定的目标(如一个特定颜色的物体),可以通过计算目标区域内所有像素的颜色直方图来定义其特征。meanShift 算法通过迭代地寻找颜色直方图中概率密度最大的点来跟踪目标的位置变化。
- 迭代过程:在每次迭代中,算法会计算当前窗口内所有点的加权平均位置(权重通常是基于距离的核函数),并将窗口中心移动到这个新位置。这一过程会重复进行,直到窗口中心的变化小于某个阈值或达到最大迭代次数为止。
函数原型
int cv::meanShift
(InputArray probImage,Rect & window,TermCriteria criteria
)
参数
- 参数probImage 对象直方图的反向投影。详情见 calcBackProject。
- 参数window 初始搜索窗口。
- 参数criteria 迭代搜索算法的停止准则。返回值:CAMSHIFT 收敛所需的迭代次数。该函数实现了迭代对象搜索算法。它接受对象的输入反向投影和初始位置。计算反向投影图像中窗口的质量中心,并将搜索窗口中心移动到质量中心。该过程重复进行,直到达到指定的迭代次数 criteria.maxCount 或者窗口中心移动的距离小于 criteria.epsilon。该算法在 CamShift 内部使用,与 CamShift 不同的是,在搜索过程中搜索窗口的大小或方向不会改变。您可以直接将 calcBackProject 的输出传递给此函数。但是,如果先对反向投影进行预过滤并去除噪声,可以获得更好的结果。例如,您可以通过 findContours 获取连通组件,丢弃面积较小的轮廓(contourArea),并使用 drawContours 绘制剩余的轮廓。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 读取视频cv::VideoCapture cap( 0 );if ( !cap.isOpened() ){std::cout << "Error opening video file" << std::endl;return -1;}cv::Mat frame, hsv, mask, hist, backproj;cv::Rect trackWindow;// 从第一帧选择ROIcap >> frame;cv::imshow( "Select ROI", frame );trackWindow = cv::selectROI( "Select ROI", frame );cv::destroyWindow( "Select ROI" );// 转换到HSV色彩空间cv::cvtColor( frame, hsv, cv::COLOR_BGR2HSV );// 创建掩码cv::inRange( hsv, cv::Scalar( 0, 60, 32 ), cv::Scalar( 180, 255, 255 ), mask );// 定义直方图的范围const int channels[] = { 0 }; // 仅使用H通道const int histSize[] = { 180 }; // H通道有180个binfloat hranges[] = { 0, 180 };const float* ranges[] = { hranges };// 计算ROI的直方图cv::calcHist( &hsv, 1, channels, mask, hist, 1, histSize, ranges );// 归一化直方图cv::normalize( hist, hist, 0, 255, cv::NORM_MINMAX );while ( true ){cap >> frame;if ( frame.empty() )break;// 计算反向投影cv::cvtColor( frame, hsv, cv::COLOR_BGR2HSV );cv::calcBackProject( &hsv, 1, channels, hist, backproj, ranges );// 执行meanShiftcv::meanShift( backproj, trackWindow, cv::TermCriteria( cv::TermCriteria::EPS | cv::TermCriteria::COUNT, 10, 1 ) );// 在图像上画出跟踪框cv::rectangle( frame, trackWindow, cv::Scalar( 255, 0, 0 ), 2, 1 );// 显示结果cv::imshow( "Mean Shift Tracking", frame );char c = ( char )cv::waitKey( 30 );if ( c == 27 )break; // 按ESC键退出}cap.release();cv::destroyAllWindows();return 0;
}
运行结果

相关文章:
OpenCV视觉分析之目标跟踪(12)找到局部的最大值函数meanShift()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在反向投影图像上找到一个对象。 meanShift 是一种用于图像处理和计算机视觉领域的算法,特别适用于目标跟踪、图像分割等任务。该算…...
《数据治理精选案例集2.0(2024版)》592页PDF(已授权分享)
《亿信华辰数据治理精选案例集2.0》是北京亿信华辰软件有限责任公司倾力打造的专业数据治理案例集,汇集了100个一线政企数据治理实践案例,覆盖13大行业和500业务场景,通过深入剖析数据治理难题,提供了新思路和实战经验,…...
【51单片机】LED点阵屏 原理 + 使用
学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 LED点阵屏显示原理74HC595 编码LED点阵屏显示笑脸LED点阵屏显示动画 LED点阵屏 点阵屏在开发板的右上角,注意使用前需要…...
Java基于SpringBoot+Vue的宠物共享平台的设计与实现(附源码,文档)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
【案例】Excel使用宏来批量插入图片
一、场景介绍 我有一个excel文件,需要通过一列的文件名称,按照规则给批量上传图片附件。 原始文件: 成功后文件: 二、实现方法 1. 使用【wps】工具打开Excel文件,将其保存为启用宏的文件。 2.找到编辑宏的【VB编辑器…...
报名开启|开放原子大赛“Rust数据结构与算法学习赛”
开放原子大赛“Rust数据结构与算法学习赛”报名进行中,报名截止时间为11月17日。 为了进一步促进开源技术的发展,提升国内开源社区的创新能力和国际影响力,开放原子开源基金会与清华大学开源操作系统训练营等单位,共同举办本次Rus…...
[翻译] 创始人模式(Founder Mode)
Founder Mode 上周在一次YC活动中,Brian Chesky发表了一场在场的每个人都难以忘怀的演讲。会后,我与大多数创始人交流时,他们都表示这是他们听过的最好的演讲。连Ron Conway也第一次忘记了记笔记。我不会试图在这里复述演讲内容,…...
拓扑排序(C++类封装+数组模拟队列和邻接表)
拓扑序列 对于任何无回路的AOV网,其顶点均可排成拓扑序列,并且其拓扑序列未必唯一。步骤如下: 1.从网中选择一个入度为0的顶点且输出。 2.从网中删除该顶点及其所有出边。 3.执行1,2,直至所有顶点已输出࿰…...
FP独立站引流革命:GG斗篷技术解锁流量新策略
在跨境电商领域,FP独立站的运营者们面临着一个共同的挑战:如何在遵守平台规则的同时,有效地吸引和保持流量。传统的引流方法如SEM、SEO、邮件推广和社交媒体营销,对于FP独立站来说,往往效果有限。但现在,一…...
管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)
在Java中,管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)是三种不同的概念,它们在应用中的作用和实现方式有所不同。以下是它们之间的主要区别: 一、管道…...
uniapp组件样式运行至小程序失效
文章目录 一、uniapp样式穿透打包运行至微信小程序失效 一、uniapp样式穿透打包运行至微信小程序失效 组件样式隔离文章参考 解决方案 options: {styleIsolation: "shared",},这个配置项改变了小程序组件的样式隔离模式,使得组件的样式能够共享和继承。…...
认识鸿蒙系统
鸿蒙系统作为华为推出的操作系统,近年来在智能手机、智能穿戴、车载和家居等多个领域取得了显著的发展。其独特的分布式技术、高性能和安全性等特点,使其在与安卓和iOS的竞争中逐渐崭露头角,有望形成三足鼎立之势。 从开发者角度来看&#x…...
Docker Compose部署Rabbitmq(Dockerfile安装延迟队列)
整个工具的代码都在Gitee或者Github地址内 gitee:solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github:GitHub - ZeroNing/solomon-parent: 这个项目主要是…...
硬件基础06 滤波器——无源、有源(含Filter Solutions、Filter Pro、MATLAB Fdatool)
目录 一、Filter Solutions 1、软件资源及安装教程如下 2、使用相关内容 二、Filter Pro使用 1、软件资源及安装教程如下 2、使用相关内容 三、MATLAB Fdatool 1、在matlab命令中输入fdatool 2、输入相关参数,例如低通、FIR、20阶、hamming窗 3、调用 &am…...
shopify模块新增内容或图片
1、后台找到指定的liquid页面,在该页面下方{% schema %} 新增需求 2、添加轮播图功能 {% comment %} 轮播代码 {% endcomment %}{% if block.settings.enable_slider %}<divclass"size-guide-slider swiper"data-slides-per-view"{{ block.setti…...
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
近日,阿里云人工智能平台PAI与复旦大学王鹏教授团队合作,在自然语言处理顶级会议EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。文章提出了一个名为 TAPIR 的知…...
置信传播算法复现
本文所涉及所有资源均在 传知代码平台 可获取。 目录 一.背景及意义介绍 1. 实际应用广泛 2. 理论研究重要性...
【在Linux世界中追寻伟大的One Piece】poll代码改写
目录 1 -> poll代码改写 1 -> poll代码改写 结合select代码,将select server更改成为pollserver,不是一件困难的事情。 #pragma once#include <iostream> #include <string> #include <poll.h> #include <memory> #inc…...
C++builder中的人工智能(17):神经网络中的自我规则非单调(Mish)激活函数
在这篇文章中,我们将探讨自我规则非单调激活函数——Mish在神经网络中的应用。了解Mish函数的工作原理,将有助于您在使用C IDE构建C应用程序时更加得心应手。 目录 神经网络中的激活函数是什么?能在C中创建激活函数吗?自我规则非…...
Java 的 Scanner 类:控制台输入与文件扫描
Java 的 Scanner 类是一个非常方便的工具类,主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容,但我们通常更喜欢它用于控制台输入,因为扫描文件可以通过文件流来完成。接下来,我们将通过几个简单的示例来讲解…...
VSCode光标主题定制指南:从颜色令牌到扩展开发
1. 项目概述:一个为开发者定制的光标主题集合如果你和我一样,每天有超过8小时的时间都泡在代码编辑器里,那么你一定会对编辑器里那个千篇一律的、闪烁的竖线光标感到审美疲劳。warrenwoodhouse/cursors这个项目,就是来解决这个“小…...
极简风项目交付倒计时!:紧急修复MJ --v 6.2中隐藏的1.33倍宽高比偏移Bug,避免客户验收驳回(含补救Prompt包)
更多请点击: https://intelliparadigm.com 第一章:极简风项目交付倒计时! 当交付周期压缩至 72 小时,极简风不再是一种美学选择,而是工程效率的刚性约束。我们摒弃冗余文档、跳过非核心评审环节,聚焦于可…...
技术视角:Sketchfab数据提取工具深度解析3D模型下载机制
技术视角:Sketchfab数据提取工具深度解析3D模型下载机制 【免费下载链接】sketchfab sketchfab download userscipt for Tampermonkey by firefox only 项目地址: https://gitcode.com/gh_mirrors/sk/sketchfab 在WebGL技术日益成熟的今天,Sketch…...
空洞骑士模组管理器Scarab:2024年最全面的安装与管理指南
空洞骑士模组管理器Scarab:2024年最全面的安装与管理指南 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装的复杂流程而烦恼吗?…...
别再拷贝exe到NXBIN了!用批处理文件搞定NX二次开发外部exe的环境变量(附VS2015/NX12配置)
告别手动拷贝:用批处理智能管理NX二次开发环境变量 每次修改完NX二次开发的外部exe程序,都要手动拷贝到NXBIN目录?这种重复劳动不仅低效,还容易导致版本混乱。其实只需一个简单的批处理脚本,就能彻底解决环境变量配置问…...
Redis高效开发工具集:从SCAN迭代到数据迁移的Python实践
1. 项目概述:一个Redis开发者的“瑞士军刀”如果你和我一样,日常开发中重度依赖Redis,那你一定遇到过这些场景:想快速查看某个大Key的内存占用,得写脚本遍历;想分析某个Pattern下的所有键,得手动…...
药物发现自动化:FEP计算工作流引擎faah的设计原理与实战
1. 项目概述:一个面向药物发现的自动化工作流引擎 最近在药物研发的自动化工具领域,一个名为 kiron0/faah 的项目引起了我的注意。这并非一个简单的脚本集合,而是一个设计精巧、旨在为药物发现中的自由能微扰计算提供端到端自动化解决方案的…...
Lingoose:轻量级LLM编排框架的设计哲学与工程实践
1. 项目概述:从“Lingo”到“Goose”,一个轻量级LLM编排框架的诞生最近在折腾大语言模型应用开发的朋友,估计都绕不开一个核心问题:如何高效、优雅地编排和串联多个LLM调用、工具调用以及数据处理流程?当你从简单的单次…...
基于BLE HID与旋转编码器打造双模式无线遥控器
1. 项目概述你有没有过这样的时刻:窝在沙发里看剧,想调个音量或者暂停一下,却不得不伸手去够茶几上的键盘或鼠标,打断那份沉浸的惬意?或者,在电脑上回味一些经典老游戏时,觉得用键盘移动、鼠标射…...
【最新 v2.7.1 版本安装包】零基础也能流畅使用,OpenClaw 无需命令一键部署保姆级教程
OpenClaw(小龙虾)Windows 一键部署保姆级教程 | 10 分钟搭建专属数字员工【点击下载最新OpenClaw安装包】 前言 2026 年开源圈热门 AI 智能体 OpenClaw(昵称小龙虾),GitHub 星标突破 28 万,凭借本地运行 …...
