当前位置: 首页 > news >正文

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()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在反向投影图像上找到一个对象。 meanShift 是一种用于图像处理和计算机视觉领域的算法&#xff0c;特别适用于目标跟踪、图像分割等任务。该算…...

《数据治理精选案例集2.0(2024版)》592页PDF(已授权分享)

《亿信华辰数据治理精选案例集2.0》是北京亿信华辰软件有限责任公司倾力打造的专业数据治理案例集&#xff0c;汇集了100个一线政企数据治理实践案例&#xff0c;覆盖13大行业和500业务场景&#xff0c;通过深入剖析数据治理难题&#xff0c;提供了新思路和实战经验&#xff0c…...

【51单片机】LED点阵屏 原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 LED点阵屏显示原理74HC595 编码LED点阵屏显示笑脸LED点阵屏显示动画 LED点阵屏 点阵屏在开发板的右上角&#xff0c;注意使用前需要…...

Java基于SpringBoot+Vue的宠物共享平台的设计与实现(附源码,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

【案例】Excel使用宏来批量插入图片

一、场景介绍 我有一个excel文件&#xff0c;需要通过一列的文件名称&#xff0c;按照规则给批量上传图片附件。 原始文件&#xff1a; 成功后文件&#xff1a; 二、实现方法 1. 使用【wps】工具打开Excel文件&#xff0c;将其保存为启用宏的文件。 2.找到编辑宏的【VB编辑器…...

报名开启|开放原子大赛“Rust数据结构与算法学习赛”

开放原子大赛“Rust数据结构与算法学习赛”报名进行中&#xff0c;报名截止时间为11月17日。 为了进一步促进开源技术的发展&#xff0c;提升国内开源社区的创新能力和国际影响力&#xff0c;开放原子开源基金会与清华大学开源操作系统训练营等单位&#xff0c;共同举办本次Rus…...

[翻译] 创始人模式(Founder Mode)

Founder Mode 上周在一次YC活动中&#xff0c;Brian Chesky发表了一场在场的每个人都难以忘怀的演讲。会后&#xff0c;我与大多数创始人交流时&#xff0c;他们都表示这是他们听过的最好的演讲。连Ron Conway也第一次忘记了记笔记。我不会试图在这里复述演讲内容&#xff0c;…...

拓扑排序(C++类封装+数组模拟队列和邻接表)

拓扑序列 对于任何无回路的AOV网&#xff0c;其顶点均可排成拓扑序列&#xff0c;并且其拓扑序列未必唯一。步骤如下&#xff1a; 1.从网中选择一个入度为0的顶点且输出。 2.从网中删除该顶点及其所有出边。 3.执行1&#xff0c;2&#xff0c;直至所有顶点已输出&#xff0…...

FP独立站引流革命:GG斗篷技术解锁流量新策略

在跨境电商领域&#xff0c;FP独立站的运营者们面临着一个共同的挑战&#xff1a;如何在遵守平台规则的同时&#xff0c;有效地吸引和保持流量。传统的引流方法如SEM、SEO、邮件推广和社交媒体营销&#xff0c;对于FP独立站来说&#xff0c;往往效果有限。但现在&#xff0c;一…...

管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)

在Java中&#xff0c;管道&#xff08;Pipes&#xff09;、过滤器&#xff08;Filters&#xff09;和拦截器&#xff08;Interceptors&#xff09;是三种不同的概念&#xff0c;它们在应用中的作用和实现方式有所不同。以下是它们之间的主要区别&#xff1a; 一、管道&#xf…...

uniapp组件样式运行至小程序失效

文章目录 一、uniapp样式穿透打包运行至微信小程序失效 一、uniapp样式穿透打包运行至微信小程序失效 组件样式隔离文章参考 解决方案 options: {styleIsolation: "shared",},这个配置项改变了小程序组件的样式隔离模式&#xff0c;使得组件的样式能够共享和继承。…...

认识鸿蒙系统

鸿蒙系统作为华为推出的操作系统&#xff0c;近年来在智能手机、智能穿戴、车载和家居等多个领域取得了显著的发展。其独特的分布式技术、高性能和安全性等特点&#xff0c;使其在与安卓和iOS的竞争中逐渐崭露头角&#xff0c;有望形成三足鼎立之势。 从开发者角度来看&#x…...

Docker Compose部署Rabbitmq(Dockerfile安装延迟队列)

整个工具的代码都在Gitee或者Github地址内 gitee&#xff1a;solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github&#xff1a;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、输入相关参数&#xff0c;例如低通、FIR、20阶、hamming窗 3、调用 &am…...

shopify模块新增内容或图片

1、后台找到指定的liquid页面&#xff0c;在该页面下方{% schema %} 新增需求 2、添加轮播图功能 {% comment %} 轮播代码 {% endcomment %}{% if block.settings.enable_slider %}<divclass"size-guide-slider swiper"data-slides-per-view"{{ block.setti…...

【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR

近日&#xff0c;阿里云人工智能平台PAI与复旦大学王鹏教授团队合作&#xff0c;在自然语言处理顶级会议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代码&#xff0c;将select server更改成为pollserver&#xff0c;不是一件困难的事情。 #pragma once#include <iostream> #include <string> #include <poll.h> #include <memory> #inc…...

C++builder中的人工智能(17):神经网络中的自我规则非单调(Mish)激活函数

在这篇文章中&#xff0c;我们将探讨自我规则非单调激活函数——Mish在神经网络中的应用。了解Mish函数的工作原理&#xff0c;将有助于您在使用C IDE构建C应用程序时更加得心应手。 目录 神经网络中的激活函数是什么&#xff1f;能在C中创建激活函数吗&#xff1f;自我规则非…...

Java 的 Scanner 类:控制台输入与文件扫描

Java 的 Scanner 类是一个非常方便的工具类&#xff0c;主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容&#xff0c;但我们通常更喜欢它用于控制台输入&#xff0c;因为扫描文件可以通过文件流来完成。接下来&#xff0c;我们将通过几个简单的示例来讲解…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...

SQLSERVER-DB操作记录

在SQL Server中&#xff0c;将查询结果放入一张新表可以通过几种方法实现。 方法1&#xff1a;使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构&#xff08;包括列名和数据类型&#xff09;将与查询结果匹配。 SELECT * INTO 新…...

2025-06-01-Hive 技术及应用介绍

Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具&#xff0c;它为海量结构化数据提供类 SQL 的查询能力&#xf…...