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

SingleTrack_Project(五)传统视觉追踪方法——背景差减法

一、基本原理

核心思想:建立背景模型,当前帧减去背景,剩下的就是运动目标。帧差法是"两帧相减",背景差减法则是"当前帧减去背景模型"。它的本质是:先给场景拍一张"空背景照片",然后用当前帧减去这张照片,差值大的区域就是运动目标。


二、关键步骤

背景差减法的过程与帧差法相似。最大的区别在于背景差减法第一步是MOG2前景检测,该方法用当前帧更新背景模型,计算当前帧每个像素与背景模型的差异,最后返回前景掩码,差异大的为白色(前景),差异小的为黑色(背景)。接下来就是二值化、形态学处理、ROI裁剪、找轮廓等。

三、关键代码实现

1.类结构与初始化

class BackgroundSubtractionTracker(BaseTracker): def __init__(self): super().__init__("bg_subtract") # 创建 MOG2 背景减除器 self.bg = cv2.createBackgroundSubtractorMOG2( history=200, # 历史帧数:用过去200帧建模背景 varThreshold=30, # 方差阈值:像素与模型的差异超过30才视为前景 detectShadows=False # 不检测阴影(提高速度,但可能把阴影误认为目标) ) self.init_bbox = None self.prev_bbox = None self.target_area = 0 self.target_aspect = 1.0 self.lost_count = 0

history:保留过去 200 帧用于建模背景。值越大,背景更新越慢,对光照变化越不敏感。
varThreshold:像素值与模型均值的差超过 30 才认为是前景。值越小,越敏感(更多前景像素)。

detectShadows:不检测阴影,提高速度,但阴影可能被误认为前景目标。

2.初始化方法

def init(self, frame, bbox): self.init_bbox = bbox # 保存初始框 self.prev_bbox = bbox # 上一帧的框(用于搜索区域约束) self.target_area = bbox[2] * bbox[3] # 目标面积 self.target_aspect = bbox[2] / (bbox[3] + 1e-6) # 目标宽高比 self.trajectory = [bbox] # ★ 关键:连续输入10帧用于建立初始背景模型 for _ in range(10): self.bg.apply(frame)

初始化时连续输入 10 帧相同图像是一个"预热"过程。MOG2 的背景模型刚开始是空的,需要观察一段时间才能建立稳定的背景模型。但这里只有一帧图像,所以把同一帧反复输入 10 次。但是存在局限性,第一帧中目标本身也在画面中,所以MOG2会把目标也作为背景部分来建模,对后续产生影响。
3.更新方法

def update(self, frame): # 步骤1:获取前景掩码 fg = self.bg.apply(frame) # ← MOG2 核心:当前帧 - 背景模型 = 前景 # 步骤2:二值化(MOG2输出是0~255,阈值为127将其转为纯黑白) _, fg = cv2.threshold(fg, 127, 255, cv2.THRESH_BINARY) # 步骤3:形态学处理(核大小为5×5,比帧差法的3×3更大) kernel = np.ones((5, 5), np.uint8) fg = cv2.morphologyEx(fg, cv2.MORPH_OPEN, kernel) # 开运算:去噪点 fg = cv2.morphologyEx(fg, cv2.MORPH_CLOSE, kernel) # 闭运算:填空洞 # 步骤4:ROI区域裁剪(以上一帧目标框为中心) x, y, w, h = self.prev_bbox margin = int(max(w, h) * 1.0) x1 = max(0, x - margin) y1 = max(0, y - margin) x2 = min(frame.shape[1], x + w + margin) y2 = min(frame.shape[0], y + h + margin) roi_fg = np.zeros_like(fg) roi_fg[y1:y2, x1:x2] = fg[y1:y2, x1:x2] # 只保留ROI区域内的前景 # 步骤5:在ROI中找最优候选框 cand = self._best_bbox(roi_fg) # 步骤6:跟丢处理 if cand is None: self.lost_count += 1 cand = self.prev_bbox # 保持上一帧位置 else: self.lost_count = 0 self.prev_bbox = cand self.trajectory.append(self.prev_bbox) return self.prev_bbox

MOG2 前景检测、二值化、形态学处理、ROI裁剪。

四、局限性

1.首帧目标会被污染:MOG2会把目标也学进背景中,目标一旦停止,它会将目标也认为是背景而造成误检。

2.对光照变化敏感:MOG2 虽然有一些自适应能力,但对快速的光照变化还是会失效。

3.阴影问题:目标的阴影仍然可能被 MOG2 检测为前景的一部分,导致检测到的目标框比实际目标大。
4.多目标干扰:和帧差法一样,如果 ROI 区域内有多个运动目标,MOG2 会产生多个前景轮廓,评分函数可能选错目标。

5.参数通用性:history=200 和 varThreshold=30 是经验值,在不同的场景中需要调整。

http://www.cnnetsun.cn/news/3322688.html

相关文章:

  • ComplimentaryGradientView高级技巧:自定义渐变起点和颜色组合的终极教程
  • PARD-Qwen3-0.6B模型架构详解:从Qwen3到PARD优化的完整技术栈
  • ChatGPT联网搜索功能性能瓶颈突破:基于真实生产环境的QPS压测数据(13.7万请求/秒下的缓存穿透防护方案)
  • AMD Qwen2.5-VL-7B-Instruct-da8w8-torchao-v0.17.0 vs 原版模型:CPU推理速度与精度对比测试
  • 5个秘诀让大模型推理速度翻倍:llama.cpp性能优化完整指南
  • 10分钟上手highcharter:从安装到绘制第一个交互式图表的完整教程
  • 紧急预警:ChatGPT低效提问正在 silently erode 你的生产力——3天内必须掌握的4个止损型提问范式
  • UE4官方鱼类资源包实战:从导入到性能优化的完整指南
  • yum 3.4.3 离线部署实战:仅下载 10 个依赖包的 3 步离线安装方案
  • AI测试学习路线图 2026版:从智能体到性能测试的6阶段进阶路径
  • Seekr高级搜索技巧:利用预定义字段和过滤器精准定位目标信息
  • (8)FPGA-CNN池化层
  • ARIA状态与属性实战教程:动态内容无障碍访问的完整解决方案
  • OpenWhispr未来路线图:即将推出的功能与改进预览
  • 5大核心功能重塑你的B站体验
  • Seekr插件系统:如何扩展和定制你的OSINT工具集
  • Python3操作MySQL由脚本小子迈向工程化开发
  • Python远程操作文件?这招不学,等于白学
  • 生产环境部署:immutable在微服务架构中的最佳实践
  • 0 基础入门React Native鸿蒙跨平台开发:速度单位换算器实战
  • pz 高级用法:如何利用自动导入功能简化复杂的数据处理任务
  • minimal-json并发处理最佳实践:线程安全与性能平衡指南
  • 5分钟解决字体焦虑:M+ FONTS让你的设计从此告别选择困难
  • Havenlon|历史中的执行控制(五):珍珠港——静默、误判与执行窗口的不可逆性
  • 99.3.智能门禁-人脸+播报-基于STM32单片机物联网设计【硬件+APP+云平台】
  • 订单自动化革命已爆发,你的团队还在人工核单?AI Agent订单处理效率提升470%,限时开放3套行业适配模板
  • 公开全项目关键词,豆包 AI + 人工双重验证护航:上市公司数字化无形资产占比 2007-2024
  • 从业务对象到可恢复编辑现场,完整理解 SAP Fiori 事务应用的 Draft 开发
  • CCManager与Devcontainer无缝集成:打造安全隔离的AI开发环境
  • 【RK3506】3、通过sysfs控制GPIO与PWM子系统