OpenCV视觉分析之目标跟踪(8)目标跟踪函数CamShift()使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

找到物体的中心、大小和方向。

CamShift(Continuously Adaptive Mean Shift)是 OpenCV 中的一种目标跟踪算法,广泛应用于视频中对象的跟踪。CamShift 算法结合了 Mean Shift 算法和颜色直方图,通过迭代寻找目标区域的颜色分布中心,从而实现目标的跟踪。

基本原理

  • 颜色直方图:首先,根据目标区域的颜色信息构建颜色直方图。颜色直方图描述了目标区域中各颜色的分布情况。
  • Mean Shift:Mean Shift 算法通过迭代寻找目标区域的颜色分布中心,逐步调整目标区域的位置和大小。
  • 适应性调整:CamShift 算法不仅调整目标区域的位置,还根据目标区域的颜色分布调整其大小和方向,从而实现更精确的跟踪。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Rect selection;
bool selecting   = false;
bool trackObject = false;
Point origin;
Mat frame;  // 声明一个全局变量来存储当前帧void onMouse( int event, int x, int y, int, void* )
{if ( selecting ){selection.x      = MIN( x, origin.x );selection.y      = MIN( y, origin.y );selection.width  = abs( x - origin.x );selection.height = abs( y - origin.y );selection &= Rect( 0, 0, frame.cols, frame.rows );  // 使用全局变量 frame}switch ( event ){case EVENT_LBUTTONDOWN:selecting = true;origin    = Point( x, y );selection = Rect( x, y, 0, 0 );break;case EVENT_LBUTTONUP:selecting = false;if ( selection.width > 0 && selection.height > 0 ){trackObject = true;}break;}
}int main()
{VideoCapture cap(0);if ( !cap.isOpened() ){cerr << "Error opening video file" << endl;return -1;}namedWindow( "CamShift Tracker", WINDOW_NORMAL );setMouseCallback( "CamShift Tracker", onMouse );while ( true ){cap >> frame;if ( frame.empty() )break;Mat hsv_frame, hue_frame, mask, backproj;cvtColor( frame, hsv_frame, COLOR_BGR2HSV );if ( trackObject ){// 提取 H(色调)通道vector< Mat > hsv_channels;split( hsv_frame, hsv_channels );Mat hue_channel = hsv_channels[ 0 ];// 计算颜色直方图Mat roi = hue_channel( selection );Mat hsv_hist;int histSize[]        = { 32 };float hranges[]       = { 0, 180 };const float* ranges[] = { hranges };calcHist( &roi, 1, 0, Mat(), hsv_hist, 1, histSize, ranges, true, false );normalize( hsv_hist, hsv_hist, 0, 255, NORM_MINMAX );// 计算反投影calcBackProject( &hue_channel, 1, 0, hsv_hist, backproj, ranges, 1, true );// 使用 CamShift 进行跟踪TermCriteria term_crit( TermCriteria::COUNT | TermCriteria::EPS, 10, 1 );RotatedRect track_box = CamShift( backproj, selection, term_crit );// 绘制跟踪结果ellipse( frame, track_box, Scalar( 0, 255, 0 ), 2 );}// 绘制选择区域if ( selecting ){rectangle( frame, selection, Scalar( 255, 0, 0 ), 2 );}imshow( "CamShift Tracker", frame );char c = waitKey( 30 );if ( c == 27 )break;  // 按下 ESC 键退出}cap.release();destroyAllWindows();return 0;
}

运行结果

在这里插入图片描述

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

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

相关文章

vue-svg-icon的安装和使用

vue-svg-icon 是一个用于在 Vue.js 项目中轻松使用 SVG 图标的库。以下是安装和使用 vue-svg-icon 的步骤&#xff0c;包括 Vue 2 和 Vue 3 的配置。 可以结合 iconfont 图标库使用 安装 vue-svg-icon 首先&#xff0c;确保你已经安装了 vue-svg-icon。你可以使用 npm 或 ya…

论文1—《基于卷积神经网络的手术机器人控制系统设计》文献阅读分析报告

论文报告&#xff1a;基于卷积神经网络的手术机器人控制系统设计 摘要 本研究针对传统手术机器人控制系统精准度不足的问题&#xff0c;提出了一种基于卷积神经网络的手术机器人控制系统设计。研究设计了控制系统的总体结构&#xff0c;并选用PCI插槽上直接内插CAN适配卡作为上…

Windows11下将某个程序添加到鼠标右键快捷菜单

经常看log&#xff0c;最喜欢用的txt查看和编辑工具是EditPlus&#xff0c;好像是个韩国软件&#xff0c;最大的优势是打开大文件&#xff0c;好几G的log文件也很轻松&#xff0c;速度快&#xff0c;然后还有各种高亮设置查找文件等&#xff0c;非常方便。但是不知道为什么&…

无人机影像处理系统技术选型

无人机功能&#xff1a;3D点云分析&#xff1b;DEM显示 一、CSharpGL 计算机图形学是一门将三维空间下的图形映射到计算机栅格屏幕的学科&#xff0c;广泛应用于游戏、虚拟现实等需要三维图形可视化的领域。OpenGL和DirectX是业内公认的标准化计算机图形学库&#xff0c;相较…

aardio 5分钟多线程开发简单入门

废话不多说 直接开干&#xff01; 借用作者话说 虽然 aardio 的多线程开发非常简单&#xff0c;但是&#xff1a; 1、请先了解:「多线程」开发比「单线程」开发更复杂这个残酷的现实。 2、请先了解: aardio 这样的动态语言可以实现真多线程非常罕见。 建议先找任意的编程语言试…

一个基于Nodejs的快速、简洁且高效的静态博客框架

大家好&#xff0c;今天给大家分享一个基于Node.js的静态博客框架Hexo&#xff0c;它以其快速、简洁且强大的特点&#xff0c;成为搭建个人博客的优选工具。 项目介绍 Hexo 是一个快速、简洁且高效的博客框架。 Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析…

c++基础12比较/逻辑运算符

比较/逻辑运算符 布尔比较运算符逻辑运算符位运算符&#xff08;也用于逻辑运算&#xff09;1<a<10怎么表达T140399判断是否为两位数代码 布尔 在C中&#xff0c;布尔类型是一种基本数据类型&#xff0c;用于表示逻辑值&#xff0c;即真&#xff08;true&#xff09;或假…

探索 Java 中 String 类的常用方法

文章目录 1. 字符串拼接&#xff08;Concatenation&#xff09;2. 字符串长度&#xff08;Length&#xff09;3. 字符串比较&#xff08;Comparison&#xff09;4. 查找和替换&#xff08;Search and Replace&#xff09;5. 字符串分割&#xff08;Split&#xff09;6. 字符串转…

Qt的跨平台介绍

在实际开发中&#xff0c;Ubuntu 使用 Qt 编译并跨平台到 Windows 的场景并不算特别常见&#xff0c;但在一些特定情况下是非常有用的&#xff0c;尤其是在开发需要支持多个平台的跨平台应用时。这种方式的应用主要体现在以下几个方面&#xff1a; Linux 环境下开发 Windows 应…

拍立淘API:当购物遇上“读图写话”

在这个看脸的时代&#xff0c;拍立淘API就像是那个总能猜中你心思的“读图写话”高手&#xff0c;你给它一张图&#xff0c;它就能给你一篇购物清单。这项技术就像是魔法&#xff0c;把图片里的商品变到你眼前。本文将带你一起走进这个魔法世界&#xff0c;看看拍立淘API是如何…

天云数据战略签约浪潮 成为浪潮智慧城市银河联盟2024优秀战略合作伙伴

3月29日,浪潮智慧城市银河联盟2024生态伙伴大会正式举办&#xff0c;来自全国各地的行业专家、技术大咖、生态伙伴齐聚一堂,共谋智慧城市新质生产力&#xff0c;助力构筑智慧便民的数字社会新图景。天云数据战略签约浪潮&#xff0c;成为浪潮智慧城市银河联盟2024生态伙伴。 济…

MySQL数据库面试题(下)

视图 为什么要使用视图&#xff1f;什么是视图&#xff1f; 为了提高复杂SQL语句的复用性和表操作的安全性&#xff0c;MySQL数据库管理系统提供了视图特性。所谓视图&#xff0c;本质上是一种虚拟表&#xff0c;在物理上是不存在的&#xff0c;其内容与真实的表相似&#xf…

【p2p、分布式,区块链笔记 Torrent】WebTorrent 的lt_donthave插件

扩展实现 https://github.com/webtorrent/lt_donthave/blob/master/index.js /*! lt_donthave. MIT License. WebTorrent LLC <https://webtorrent.io/opensource> */// 导入所需模块 import arrayRemove from unordered-array-remove // 用于从数组中删除元素的函数 i…

HarmonyOS第一课——DevEco Studio的使用

HarmonyOS第一课 DevEco Studio的使用 集成开发环境&#xff1a; SDK构建插件ohpm等工具 DevEco Studio提供开箱即用的开发体验&#xff0c;将HarmonyOS SDK、Node.js、Hvigor、OHPM、模拟器平台等进行合一打包&#xff0c;简化DevEco Studio安装配置流程。 HarmonyOS SDK已…

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备汇聚公共资源场景方案全析

随着信息技术的飞速发展&#xff0c;视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。特别是在公共资源管理方面&#xff0c;视频监控的应用日益广泛&#xff0c;涵盖了智慧城市、智能交通、大型企业以及校园安防等多个领域。NVR小程序接入平台EasyNVR作为一款功…

C/C++使用AddressSanitizer检测内存错误

AddressSanitizer 是一种内存错误检测工具&#xff0c;编译时添加 -fsanitizeaddress 选项可以在运行时检测出非法内存访问&#xff0c;当发生段错误时&#xff0c;AddressSanitizer 会输出详细的错误报告&#xff0c;包括出错位置的代码行号和调用栈&#xff0c;有助于快速定位…

contenteditable实现需要一个像文本域一样的可编辑框

我这里是因为左上和右下有一个固定的模板&#xff0c;所有用textarea有点不方便&#xff0c;查了下还有一个方法可以解决就是在需要编辑的元素上加上 :contenteditable"true" 完整代码如下&#xff0c;因为这个弹窗是两用的&#xff0c;所以用messageType做了一下判…

QML项目实战:自定义Switch按钮

目录 一.添加模块 1.QtQuick.Controls 2.1 2.QtGraphicalEffects 1.12 二.自定义Switch 三.标签 四.效果 五.代码 一.添加模块 1.QtQuick.Controls 2.1 QtQuick.Controls 提供了一组预定义的 UI 控件&#xff0c;这些控件可以用于构建现代、响应式的用户界面。它包括按…

【数据集】【YOLO】【目标检测】电动车佩戴头盔检测数据集 5448 张,YOLO/VOC格式标注!

数据集介绍 【数据集】电动车头盔检测数据集 5448 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。数据集中包含3种分类&#xff0c;包含两轮电动车、戴头盔、不戴头盔。数据集来自国内外监控摄像头截图。检测范围电动车、摩托车、双轮非自行车。 一、数据概述 佩戴…

ACM社团第一次测试题解(禁止直接复制粘贴提交)

第一题&#xff1a;中位数 思路&#xff1a; 解法一&#xff1a;暴力比较&#xff0c;两个数之间一直比较得出中位数 解法二&#xff1a;快排函数&#xff0c;数组中间值即为中位数 代码&#xff1a; 1.c语言版&#xff1a; #include <stdio.h> int arr[10010]; vo…