opencv-Meanshift 和 Camshift 算法

MeanShiftCamShift 都是用于目标跟踪的算法,基于颜色直方图的方法。它们主要用于在视频序列中追踪运动的对象。

  1. MeanShift(均值漂移):

    • 原理: MeanShift 算法的基本思想是通过不断调整窗口的中心,使得窗口中的样本点的平均值向目标的密度最大的区域移动。具体来说,它使用核密度估计来寻找样本分布的最大概率密度,并将窗口中心移动到密度最大的位置。

    • 应用: MeanShift 在静止相机下的目标跟踪中表现较好,但对于一些场景变化较大、目标形变明显的情况,可能会出现跟踪不稳定的问题。

  2. CamShift(连续自适应均值漂移):

    • 原理: CamShift 是 MeanShift 的改进版本,主要是在 MeanShift 的基础上增加了对目标的尺度变化和旋转的适应性。CamShift 在追踪时可以调整窗口的大小和方向,从而适应目标的尺度和旋转变化。

    • 应用: CamShift 在相机运动和目标变形较大的情况下更为稳健,它可以自适应地调整窗口大小和方向,以适应目标的变化。

cv2.polylines 函数用于在图像上绘制多边形。以下是函数的一般形式和参数说明:

cv2.polylines(img, pts, isClosed, color, thickness[, lineType[, shift]])
  • img: 要绘制多边形的图像。

  • pts: 多边形的顶点。这是一个包含数组的列表,每个数组表示一个顶点的坐标。

  • isClosed: 一个布尔值,指示多边形是否封闭。如果为 True,则多边形将首尾相连形成封闭图形。

  • color: 多边形的颜色,通常是一个表示颜色的元组,例如 (B, G, R)。

  • thickness: 多边形边界的厚度。

  • lineType(可选): 线条的类型,通常使用默认值 cv2.LINE_8

  • shift(可选): 像素坐标点的小数位数,通常使用默认值 0。

cv2.CamShift 是 OpenCV 中用于实现 CamShift(Continuous Adaptive Mean Shift)目标跟踪算法的函数。CamShift 是 MeanShift 算法的一种扩展,能够自适应地调整窗口的大小和方向,以适应目标的尺度和旋转变化。

以下是 cv2.CamShift 函数的一般形式和参数说明:

retval, track_window = cv2.CamShift(probImage, window, criteria)
  • probImage: 反向投影图像,表示目标的概率分布。

  • window: 初始搜索窗口的位置和大小,通常由之前的目标检测或跟踪给出。

  • criteria: 定义迭代停止条件的元组 (type, maxCount, epsilon)

    • type: 迭代停止类型,通常为 cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT

    • maxCount: 最大迭代次数。

    • epsilon: 迭代停止的阈值。

  • retval: 一个包含返回值的元组,其中包括追踪目标的信息,如位置、大小和方向。

  • track_window: 更新后的追踪窗口。

cv2.meanShift 是 OpenCV 中用于实现 MeanShift 目标跟踪算法的函数。MeanShift 是一种迭代的无参数方法,用于寻找图像中的目标区域。该算法主要用于目标在静止相机下的跟踪。

以下是 cv2.meanShift 函数的一般形式和参数说明:

retval, track_window = cv2.meanShift(probImage, window, criteria)
  • probImage: 反向投影图像,表示目标的概率分布。

  • window: 初始搜索窗口的位置和大小,通常由之前的目标检测或跟踪给出。

  • criteria: 定义迭代停止条件的元组 (type, maxCount, epsilon)

    • type: 迭代停止类型,通常为 cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT

    • maxCount: 最大迭代次数。

    • epsilon: 迭代停止的阈值。

  • retval: 一个包含返回值的元组,其中包括追踪目标的信息,如位置和大小。

  • track_window: 更新后的追踪窗口。

在 OpenCV 中,可以使用 cv2.meanShift 函数进行 MeanShift 算法的目标跟踪,以及 cv2.CamShift 函数进行 CamShift 算法的目标跟踪。以下是一个简单的示例,演示如何使用 CamShift 进行目标跟踪:

import cv2
import numpy as np

# 读取视频文件
cap = cv2.VideoCapture(r"C:\Users\mzd\Desktop\opencv\1.mp4")

# 读取第一帧
ret, frame = cap.read()

# 定义追踪窗口的初始位置
x, y, w, h = 300, 200, 100, 50
track_window = (x, y, w, h)

# 提取追踪窗口中的直方图
roi = frame[y:y+h, x:x+w]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, (0, 60, 32), (180, 255, 255))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)

# 设置追踪参数
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 将当前帧转换为 HSV 色彩空间
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 使用反向投影计算图像中的目标位置
    dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)

    # 应用 CamShift 算法进行目标跟踪
    ret, track_window = cv2.CamShift(dst, track_window, term_crit)

    # 绘制跟踪窗口
    pts = cv2.boxPoints(ret)
    pts = np.int0(pts)
    img = cv2.polylines(frame, [pts], True, (0, 255, 0), 2)

    cv2.imshow('CamShift Tracking', img)

    if cv2.waitKey(30) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

在这个示例中,我们首先读取视频并提取第一帧,然后定义了追踪窗口的初始位置。接着,我们从追踪窗口中提取直方图,并在每一帧中使用反向投影计算目标的位置,并应用 CamShift 算法进行目标跟踪。最后,使用 OpenCV 的绘图函数在图像上绘制跟踪窗口。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端】让列表像Excel单元格一样编辑

前言 领导说了一堆的话,最后总结一句就是客户很懒,客户的员工更加懒。 本着让别人节省时间的原则,提倡出了让列表和Excal的单元格一样,不仅看数据还可以随时更改数据。 查资料 根据 Jeecg-Vue3 源码介绍,从而知道是基于 Vben Admin 开源项目进行改造的。 因此在 Vben…

JavaScript之DOM操作

第一章 API介绍 ​API是一种事先定义好的函数,用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。 ​Web API接口:浏览器提供的一系列操作浏览器功能和页面元素的API(BO…

opencv-背景减除

背景减除(Background Subtraction)是一种用于从视频序列中提取前景对象的计算机视觉技术。该技术的主要思想是通过建模和维护场景的背景,从而检测出在不同时间点出现的前景对象。 OpenCV 提供了一些用于背景减除的函数,其中最常用…

记录ruoyi-plus-vue部署的问题

ruoyi-vue-plus5.x 后端 ruoyi-vue-plus5.x 前端 前端本地启动命令 # 克隆项目 git clone https://gitee.com/JavaLionLi/plus-ui.git# 安装依赖 npm install --registryhttps://registry.npmmirror.com# 启动服务 npm run dev# 构建生产环境 yarn build:prod # 前端访问地址…

深入学习pytorch笔记

两个重要的函数 dir(): 一个内置函数,用于列出对象的所有属性和方法 help():一个内置函数,用于获取关于Python对象、模块、函数、类等的详细信息 Dateset类 Dataset:pytorch中的一个类,开发者在训练和…

什么是高防CDN?CDN的设计原理及应用场景是什么?

随着互联网的快速发展,人们对网络的速度和稳定性要求也越来越高。CDN技术作为网络优化的重要手段,被越来越多的企业和网站所采用。现在我为大家介绍一下CDN的设计原理以及应用场景。 一.高防CDN技术概述 高防CDN是一种应用了高级防御技术的内容分发网络…

【大数据】Docker部署HMS(Hive Metastore Service)并使用Trino访问Minio

本文参考链接置顶: Presto使用Docker独立运行Hive Standalone Metastore管理MinIO(S3)_hive minio_BigDataToAI的博客-CSDN博客 一. 背景 团队要升级大数据架构,需要摒弃hadoop,底层使用Minio做存储,应用…

配置mvn打包参数,不同环境使用不同的配置文件

方法一: 首先在/resource目录下创建各自环境的配置 要在不同的环境中使用不同的配置文件进行Maven打包,可以使用Maven的profiles特性和资源过滤功能。下面是配置Maven打包参数的步骤: 在项目的pom.xml文件中,添加profiles配置…

Lubuntu 23.10用户可使用LXQt 1.4桌面

导读在众多 Lubuntu 用户的要求下,Lubuntu 开发人员决定将 LXQt 1.4 桌面环境向后移植到最新的 Lubuntu 23.10 (Mantic Minotaur) 版本。 是的,您没看错,您现在可以使用官方的 Lubuntu Backports PPA(个人软…

“java.lang.IllegalStateException: No ConfigurableListableBeanFactory set“,缺少配置

一、错误分析 做品优购项目的运营商安全登录时,运行项目后,浏览器访问模板页,模板页的表格无法正常显示,报错信息如下: SEVERE: StandardWrapper.Throwable java.lang.IllegalStateException: No ConfigurableLista…

window.requestAnimationFrame+localStorage+canvas实现跨窗口小球连线效果

文章目录 前言效果代码后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端系列文章 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家…

session、cookie的区别

前言 cookie存在于客户端(浏览器),session存在于服务端。session的主要信息存在于服务器,在客户端只存放一个sessionid(基于cookie的),每次请求,客户端都会自动把sessionid发送到服…

儿童在线学习系统 宝宝云幼儿园服务微信小程序的设计与实现

综合运用所学的程序设计基础、数据结构、数据库原理及应用、高级语言程序设计、面向对象程序设计、软件需求分析与建模、软件设计与体系结构、软件测试等课程知识,设计开发一个较实用的应用系统。 通过该设计可以巩固并提高软件工程专业学生的软件需求分析、设计、开…

css实现图片绕中心旋转,鼠标悬浮按钮炫酷展示

vue模板中代码 <div class"contentBox clearfix home"><div class"circle"><img class"in-circle" src"../../assets/img/in-circle.png" alt""><img class"out-circle" src"../../as…

【小尘送书-第十二期】计算机考研精炼1000题——助力每一个考研人成功上岸

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

flutter,uni-app开发调试ios

一、申请ios开发者账号 二、ios开发者配置 ios 开发者需要配置的地方 https://developer.apple.com/account/resources/certificates/list Certificates&#xff08;证书&#xff09;: 作用&#xff1a; 证书用于对应用程序和开发者进行身份验证&#xff0c;确保安全性和可…

企业数字化转型转什么?怎么转?这份攻略请收好

目录 -01-数字化转型“是什么” -02-数据驱动推动企业数字化转型 -03-企业数字化转型的行动路线图 数字化转型&#xff0c;转什么&#xff1f;怎么转&#xff1f;这些问题仍在困扰不少企业&#xff0c;也是每个企业转型升级不得不思考的重要问题。对此&#xff0c;中关村数字…

Docker Desktop 安装使用教程

一、前言 作为开发人员&#xff0c;在日常开发中&#xff0c;我们需要在本地去启动一些服务&#xff0c;如&#xff1a;redis、MySQL等&#xff0c;就需要去下载这些在本地去启动&#xff0c;操作较为繁琐。此时&#xff0c;我们可以使用Docker Desktop&#xff0c;来搭建我们需…

【SpringCloud】微服务的扩展性及其与 SOA 的区别

一、微服务的扩展性 由上一篇文章&#xff08;没看过的可点击传送阅读&#xff09;可知&#xff0c; 微服务具有极强的可扩展性&#xff0c;这些扩展性包含以下几个方面&#xff1a; 性能可扩展&#xff1a;性能无法完全实现线性扩展&#xff0c;但要尽量使用具有并发性和异步…