PiscCode使用OpenCV和Python实现运动检测与可视化

光流分析是计算机视觉中的重要技术,用于检测视频序列中物体的运动模式。本文将介绍如何使用OpenCV和Python实现一个实时的光流分析系统,该系统能够检测运动、生成热力图并提供详细的统计分析。

技术概述

本系统基于Farneback稠密光流算法,能够:

  1. 实时计算视频帧之间的运动向量

  2. 生成运动热力图可视化

  3. 提供多种统计分析(均值、中位数、众数等)

  4. 显示历史数据趋势图表

核心代码解析

初始化设置

class DenseOpticalFlow:def __init__(self):self.init_parameters()self.prev_time = Noneself.fps = 30# 历史统计数据self.max_history_length = 100self.displacement_history = deque(maxlen=self.max_history_length)self.mean_history = deque(maxlen=self.max_history_length)self.median_history = deque(maxlen=self.max_history_length)self.mode_history = deque(maxlen=self.max_history_length)self.speed_history = deque(maxlen=self.max_history_length)

使用deque数据结构来存储历史数据,自动维护固定长度的历史记录。

光流计算

def do(self, frame, device="cpu"):current_time = cv2.getTickCount() / cv2.getTickFrequency()gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算光流flow = cv2.calcOpticalFlowFarneback(self.prev_gray, gray_frame, None,self.flow_params["pyr_scale"], self.flow_params["levels"],self.flow_params["winsize"], self.flow_params["iterations"],self.flow_params["poly_n"], self.flow_params["poly_sigma"],self.flow_params["flags"])

使用OpenCV的calcOpticalFlowFarneback函数计算稠密光流,该算法能够为每个像素点生成运动向量。

数据处理与可视化

# 计算运动幅值
magnitude, _ = cv2.cartToPolar(flow[...,0], flow[...,1])# 排除0值,只分析实际运动区域
nonzero_magnitude = magnitude[magnitude > 0]# 生成热力图
magnitude_norm = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX)
heatmap = cv2.applyColorMap(np.uint8(magnitude_norm), cv2.COLORMAP_INFERNO)
通过极坐标转换获取运动幅值,并使用INFERNO色彩映射生成热力图,红色表示高强度运动,蓝色表示低强度运动。

统计分析

# 计算统计量
if len(nonzero_magnitude) > 0:mean_val = float(np.mean(nonzero_magnitude))median_val = float(np.median(nonzero_magnitude))mode_val = float(stats.mode(nonzero_magnitude, keepdims=True)[0][0])
else:mean_val = median_val = mode_val = 0.0# 更新历史数据
self.mean_history.append(mean_val)
self.median_history.append(median_val)
self.mode_history.append(mode_val)

系统计算三种主要统计量:

  • 均值:运动幅值的平均值

  • 中位数:运动幅值的中位数,对异常值不敏感

  • 众数:最常见的运动幅值

可视化界面

def add_statistics_chart(self, side_by_side, magnitude):# 创建matplotlib图表fig = plt.figure(figsize=(width/100, chart_height/100), dpi=100)gs = fig.add_gridspec(1,2, width_ratios=[1,1], wspace=0.3)# 左图:当前帧位移分布直方图ax1 = fig.add_subplot(gs[0])if len(magnitude) > 0:ax1.hist(magnitude.flatten(), bins=30, color="green", alpha=0.7)# 右图:历史统计趋势线ax2 = fig.add_subplot(gs[1])x_vals = np.arange(len(self.mean_history))if len(x_vals) > 0:ax2.plot(x_vals, list(self.mean_history), label="Mean", color="blue")ax2.plot(x_vals, list(self.median_history), label="Median", color="orange")ax2.plot(x_vals, list(self.mode_history), label="Mode", color="green")

可视化界面分为两部分:

  1. 左侧直方图:显示当前帧的运动幅值分布

  2. 右侧折线图:显示最近100帧的统计趋势

应用场景

1. 运动检测与监控

  • 检测监控视频中的异常运动

  • 统计人流量和运动模式

  • 识别运动方向和强度

2. 体育分析

  • 分析运动员的运动轨迹

  • 计算运动速度和加速度

  • 评估运动表现

3. 交通监控

  • 检测车辆运动

  • 分析交通流量

  • 识别交通违规行为

4. 科学研究

  • 动物行为研究

  • 流体动力学分析

  • 微观粒子运动跟踪

结论

本文介绍的光流分析系统提供了一个完整的运动检测解决方案,结合了实时处理、统计分析和可视化功能。通过OpenCV和Python的强大组合,开发者可以轻松实现各种运动相关的计算机视觉应用。

该系统具有良好的可扩展性,可以根据具体需求添加更多功能,如物体跟踪、行为识别和高级统计分析。无论是学术研究还是工业应用,这都是一个强大的基础框架。

对 PiscTrace or PiscCode感兴趣?更多精彩内容请移步官网看看~🔗 PiscTrace

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

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

相关文章

Day 36 复习日

浙大疏锦行 今天是复习日,神经网络与机器学习最大的不同就是不止固定的三行代码,需要自己定义一个模型,先继承类的属性,然后去写自己的属性,以及前向传播方法,可以手动构建:中间层的数量、每一…

ES6/ES2015 - ES16/ES2025

ES6/ES2015 - ES16/ES2025 ECMAScript(简称ES)是JavaScript的官方标准,从2015年开始每年发布一个新版本。 版本一览表年份版本主要新特性2015ES6/ES2015let/const、箭头函数、Class、模板字符串、解构赋值、模块、Promise2016ES7/ES2016指数运…

BIM 地铁站可视化:智慧运维 “透视镜”

图扑 BIM 地铁站可视化系统,以三维建模完整复刻车站空间,从出入口、站厅到设备层,管线走向、设施分布精准呈现。实时汇聚客流数据、空调等设备运行状态,动态标记设备告警、空间占用情况。通过透明化模型,运维人员可直观…

淘宝商品详情页数据接口设计与实现:从合规采集到高效解析

在电商数据分析、比价系统开发等场景中,商品详情页数据是核心基础。本文将围绕淘宝商品详情页数据接口的合规设计、高效采集与智能解析展开,提供一套可落地的技术方案,重点解决动态渲染、参数加密与数据结构化等关键问题。 一、接口设计原则…

HTML应用指南:利用GET请求获取中国银行人民币存款利率数据

人民币存款利率是影响居民储蓄行为和企业资金配置的关键因素,也是宏观经济调控的重要工具。中国银行根据中国人民银行的指导政策,结合市场情况与自身经营策略,定期调整并公布人民币存款利率标准。这些利率信息主要涵盖活期存款、定期存款&…

RPS和QPS

简介 这是系统设计中两个最核心且容易混淆的性能指标。简单来说: • RPS 是 “每秒请求数”,是从客户端或负载均衡器的视角看,服务器每秒接收到的请求数量。 • QPS 是 “每秒查询数”,通常是从数据库或特定服务的视角看&…

如何将用户反馈转化为可执行需求

用户反馈是企业优化产品、改进服务的重要依据。将用户反馈转化为可执行需求的核心在于通过系统化的流程对反馈进行收集、分析和分类,并结合企业的战略目标与技术能力,制定出具体的执行方案。这一过程不仅要求企业深入理解用户需求,还需要跨部…

ry-vue docker部署

目录 整体架构概览 创建 Docker 自定义网络 Redis 部署(缓存服务) redis.conf修改 启动 Redis 容器 测试 启动 MySQL 容器 允许 root 用户远程访问(%) 初始化数据库(可选) RuoYi-Admin 后端服务部…

Redis之Keys命令和Scan命令

序言 网上看到的面试题:Redis有1亿个key,其中10w个key是以某个固定的前缀开头,如何将它们全部找出来?一般有两种命令可以实现: Keys命令Scan命令 下面具体分析一下两种命令 Keys命令 Keys pattern如下图所示&…

【小沐学GIS】基于Godot绘制三维数字地球Earth(Godot)

🍺三维数字地球GIS系列相关文章(C)如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut&…

day62 Floyd 算法 A * 算法

Floyd 算法本题是经典的多源最短路问题.Floyd 算法对边的权值正负没有要求,都可以处理。Floyd算法核心思想是动态规划。例如我们再求节点1 到 节点9 的最短距离,用二维数组来表示即:grid[1][9],如果最短距离是10 ,那就…

【软考论文】论可观测性架构技术的应用

🎁 考高级架构师的小伙伴注意了!📢 软考架构论文示例 2025年11月软考架构论文预测👍 一、历年论文题目 无!!! 二、考情分析 “可观测性技术”这一论题,目前在高级架构师与高级系统分…

软件测试:测试分类(一)

常用测试分类1.功能测试(人对功能的确定,保证某个功能可以正常进行)如验证你输入正确的手机号码和密码是否登录成功。手机号码不存在是否有提示,密码不正确是否有提示等2.自动化测试(如jmeter,属于黑盒测试…

BigFoot (Method Raid Tools)[MRT] (Event Alert Mod)[EAM]

检查法术技能ID,需要EAM命令,所以要先安装EAM BigFoot EventAlertMod lua-CSDN博客 /eam lookup 冰封之韧 同时我们发现一个糟糕的问题,为什么会有这么多ID呢,默认第一个 还有一种法子就是让别人开了技能告诉你ID,最…

【Scrapy-Redis】分布式爬虫实战(非常详细)

一、概要 1.分布式爬虫概念 分布式爬虫是一种利用多台机器协同工作的网络爬虫系统,通过任务分解、并行处理和资源共享,高效抓取并处理海量网页数据。其核心在于将爬取任务分配到不同节点,避免单点性能瓶颈,同时支持动态扩展和容错…

基于51单片机智能化交通红绿灯堵车流量红外设计

1 系统功能介绍 本设计题目为 基于51单片机智能化交通红绿灯堵车流量红外设计,主要用于十字路口交通信号智能控制,通过红外避障检测车流量,自动调节红绿灯时间,缓解拥堵。该系统由单片机、LED灯、红外避障传感器、LCD1602液晶显示…

VsCode 上的Opencv(C++)环境配置(Linux)

1.下载Opencv1.新建文件demo_cpp,在demo_cpp中新建third_parties文件2.OPENCV官网下载OpenCV-4.12.03.将下载好的opencv-4.12.0.zip压缩包在third_parties中解压,//以下均无特殊说明,均在vscode里的TERMINAL中输入 sudo apt-get install unzip//用于解压.zip文件 cd third_part…

sql xml模板

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace"com.example.mapper.UserMapper&quo…

docker在自定义网络中安装ElasticSearch和Kibana

创建自定义网络 创建一个名为 es-net 的桥接网络。这将作为 Elasticsearch 和 Kibana 的私有通信通道。 # 创建网络 docker network create es-net # 查看网络是否创建成功 docker network ls启动 Elasticsearch 容器 安装命令 docker run -d \--name elasticsearch \--net…

基于51单片机射频RFID停车刷卡计时收费系统设计

1 系统功能介绍 本设计题目为 基于51单片机射频RFID停车刷卡计时收费系统设计&#xff0c;旨在实现停车场车辆的刷卡计时和收费管理。系统通过单片机控制&#xff0c;结合 RFID 射频识别技术、LCD1602 显示以及蜂鸣器报警&#xff0c;实现停车时间的智能计时、累加及超时提醒功…