OpenCVSharp:使用MOG进行运动物体识别
目录效果实现效果动态效果实现运动物体检测是计算机视觉中的一个重要应用广泛应用于安防监控、交通分析、人机交互等领域。本文将详细介绍如何使用OpenCVSharp中的MOGMixture of Gaussians算法实现运动物体检测并通过一个完整的WPF应用程序示例展示实际应用。什么是MOG算法MOGMixture of Gaussians高斯混合模型是一种基于背景建模的运动检测算法。它通过对每个像素建立多个高斯分布模型来表示背景能够有效处理光照变化、树叶摇曳等动态背景干扰。MOG算法原理背景建模为每个像素建立K个高斯分布模型模型匹配将当前像素值与已有模型进行匹配模型更新根据匹配结果更新模型参数前景检测不匹配任何背景模型的像素被标记为前景ViewModel设计我们使用MVVM模式设计应用程序主要包含以下属性和命令public classMovingObjectDetectionViewModel : BindableBase { // 视频路径 publicstring VideoPath { get; set; } // 图像显示 public BitmapImage OriginalImage { get; set; } public BitmapImage ProcessedImage { get; set; } // 处理状态 publicbool IsProcessing { get; set; } publicstring StatusMessage { get; set; } // 检测参数 publicdouble DetectionThreshold { get; set; } // 统计信息 publicint FrameCount { get; set; } publicint DetectedObjectsCount { get; set; } // 命令 public ICommand SelectVideoCommand { get; privateset; } public ICommand RunCommand { get; privateset; } public ICommand StopCommand { get; privateset; } }主要实现在RunAsync中我们来学习一下用到了OpenCVSharp的哪些方法。using var capture new VideoCapture(VideoPath); // 获取视频信息 int frameWidth (int)capture.Get(VideoCaptureProperties.FrameWidth); int frameHeight (int)capture.Get(VideoCaptureProperties.FrameHeight); double fps capture.Get(VideoCaptureProperties.Fps); int totalFrames (int)capture.Get(VideoCaptureProperties.FrameCount);首先可以这样获取视频的一些信息using var mog BackgroundSubtractorMOG.Create(); using var frame new Mat(); using var fg new Mat(); using var kernel Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(5, 5));遇到了一个新东西Cv2.GetStructuringElement。这行代码是创建一个形态学操作的结构元素也称为核或卷积核用于图像处理中的形态学变换。Cv2.MorphologyEx(fg, fg, MorphTypes.Open, kernel);这是OpenCVSharp中执行高级形态学操作的函数支持多种形态学变换类型。参数说明第一个参数 fg输入图像即经过MOG背景减除后的前景掩码第二个参数 fg输出图像处理后的结果会覆盖原图像第三个参数 MorphTypes.Open指定形态学操作类型为开运算第四个参数 kernel之前创建的5×5椭圆形结构元素开运算Opening Operation是形态学处理中的一种基本操作它由腐蚀Erosion后跟膨胀Dilation两个步骤组成开运算 腐蚀 膨胀。开运算的效果去除小噪声消除图像中的孤立白点小噪声区域平滑轮廓使物体轮廓更加平滑断开细小连接轻微分离可能连接在一起的不同物体保持主要形状不显著改变物体的大小和基本形状我们需要大概了解一下腐蚀与膨胀是什么意思。腐蚀膨胀// 查找轮廓 OpenCvSharp.Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(fg, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);又接触到了一个新东西Cv2.FindContours()这是OpenCV中查找轮廓的核心函数用于在二值图像中检测物体边界。参数详解第一个参数 fg输入的二值图像经过形态学处理的前景掩码第二个参数 out contours输出的轮廓数组第三个参数 out hierarchy输出的轮廓层次结构第四个参数 RetrievalModes.External轮廓检索模式第五个参数 ContourApproximationModes.ApproxSimple轮廓近似方法轮廓检索模式RetrievalModes.External含义只检测最外层轮廓适用场景运动物体检测因为我们只关心物体的外部边界效果忽略物体内部的孔洞其他可选模式RetrievalModes.External // 只检测外轮廓 RetrievalModes.List // 检测所有轮廓不建立层次关系 RetrievalModes.CComp // 检测所有轮廓建立两层层次关系 RetrievalModes.Tree // 检测所有轮廓建立完整的层次树轮廓近似方法ContourApproximationModes.ApproxSimple含义压缩水平、垂直、对角方向的元素只保留端点效果减少轮廓点数提高处理速度适用场景矩形或近似矩形的物体其他可选方法ContourApproximationModes.ApproxNone // 保存所有轮廓点 ContrieApproximationModes.ApproxSimple // 压缩轮廓保留端点 ContourApproximationModes.ApproxTC89L1 // Teh-Chin链逼近算法L1 ContourApproximationModes.ApproxTC89KCOS // Teh-Chin链逼近算法KCOS// 绘制检测到的运动物体 foreach (var contour in contours) { double area Cv2.ContourArea(contour); if (area 300) // 过滤掉太小的区域 { currentFrameObjects; var rect Cv2.BoundingRect(contour); Cv2.Rectangle(frame, rect, Scalar.Red, 2); } }Cv2.ContourArea()计算轮廓包围的面积Cv2.BoundingRect()计算轮廓的最小外接矩形Cv2.Rectangle()绘制矩形就这样处理每一帧就可以得到上面的效果了。引入地址

相关新闻

Flink 运行模式

Flink 运行模式

1.Standalone 运行模式 独立模式是独立运行的,不依赖任何外部的资源管理平台;当然独立也是有代价的:如果资源不足,或者出现故障, 没有启动扩展或重分配资源的保证,必须手动处理。所以独立模式一般只用在开发测试或作业…

2026/6/28 2:28:14阅读更多 →
Hermes Agent 这次更新有点猛:MoA 跑分超过 Opus 4.8 和 GPT 5.5

Hermes Agent 这次更新有点猛:MoA 跑分超过 Opus 4.8 和 GPT 5.5

今天这个更新,我觉得 Hermes Agent 可以单独拿出来说一下, 不是因为它又接了一个模型,也不是因为它做了一个新按钮, 而是 Nous Research 把 MoA,也就是 Mixture of Agents,做成了 Hermes Agent 里的一个虚…

2026/6/28 2:28:14阅读更多 →
【C语言避坑指南】为什么 fscanf 读取逗号分隔的数据会失败?深度解析与解决方案

【C语言避坑指南】为什么 fscanf 读取逗号分隔的数据会失败?深度解析与解决方案

1. 案发现场&#xff1a;代码与现象我们先来还原一下问题场景。这段代码的意图很简单&#xff1a;定义一个学生结构体&#xff0c;将其写入文件&#xff0c;然后再读出来打印。原始代码#include <stdio.h>struct stu {char name[20];int age;int math; };int main() {str…

2026/6/28 2:28:14阅读更多 →
【Ambari Plus】Step8—MariaDB 初始化

【Ambari Plus】Step8—MariaDB 初始化

Step8—MariaDB 初始化 Ambari Server 后面会把元数据写入 MariaDB&#xff0c;所以数据库要提前准备好。这一步只处理 MariaDB 服务本身&#xff1a;安装、字符集、监听地址、root 密码和远程连通验证。Ambari 专用库和专用用户放到 Step9 再创建。 本文只在核心节点 hadoop1.…

2026/6/28 4:08:18阅读更多 →
别急着教 Agent 思考,先喂它吃口干净的:ETL 入门

别急着教 Agent 思考,先喂它吃口干净的:ETL 入门

别急着教 Agent 思考&#xff0c;先喂它吃口干净的&#xff1a;ETL 入门 摘要&#xff1a;很多人一上来就盯着 Agent 的规划、决策、反思&#xff0c;却把更底下那层忘了&#xff1a;数据到底干不干净。ETL 在 Agent 时代一点都不过时&#xff0c;反而更要命。传统程序吃到脏数…

2026/6/28 4:08:18阅读更多 →
熬夜压力大白发越来越多?科学解析与营养干预指南

熬夜压力大白发越来越多?科学解析与营养干预指南

熬夜压力大白发越来越多&#xff1f;这是很多当代成年人都会遇到的头发问题&#xff0c;从临床营养角度来看&#xff0c;这种现象确实和长期的不良生活状态直接相关&#xff0c;大多是毛囊核心营养缺口导致黑色素合成不足引发的&#xff0c;通过科学的营养补充可以有效干预改善…

2026/6/28 4:08:18阅读更多 →
【网络安全】svn信息泄漏

【网络安全】svn信息泄漏

一、svn介绍SVN&#xff0c;全称为 Subversion&#xff0c;是一个开源的集中式版本控制系统&#xff08;CVCS&#xff09;。在 Git 彻底统治开源界之前&#xff0c;SVN 曾是软件开发团队进行代码管理和协同开发的绝对主流工具。结合你正在使用 dvcs-ripper 进行安全测试的背景&…

2026/6/28 4:08:18阅读更多 →
不定积分不是导数逆向计算,是沿着螺旋轨迹反向累加全部无穷小微观生长单元,还原完整宏观脉络-《全域数学vs传统数学:人类文明进阶200讲》第53讲 高中通俗版逐字稿

不定积分不是导数逆向计算,是沿着螺旋轨迹反向累加全部无穷小微观生长单元,还原完整宏观脉络-《全域数学vs传统数学:人类文明进阶200讲》第53讲 高中通俗版逐字稿

《全域数学vs传统数学&#xff1a;人类文明进阶200讲》第53讲 高中通俗版逐字稿 讲次&#xff1a; 第53讲 主题&#xff1a; 不定积分不是导数逆向计算&#xff0c;是沿着螺旋轨迹反向累加全部无穷小微观生长单元&#xff0c;还原完整宏观脉络 对标课本知识点&#xff1a; 不…

2026/6/28 4:08:18阅读更多 →
湖北香樟好不好?踩过死苗返工坑,5年采购商总结5条避坑干货

湖北香樟好不好?踩过死苗返工坑,5年采购商总结5条避坑干货

做苗木采购5年&#xff0c;被问得最多的问题之一就是“湖北香樟好不好”。说实话&#xff0c;作为长江流域原生的乡土树种&#xff0c;湖北香樟本身冠幅饱满、气候适配性强&#xff0c;正常移栽成活率能到90%以上&#xff0c;是市政、地产项目的稳妥选择。 但我前前后后踩过的香…

2026/6/28 4:03:18阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月&#xff0c;Boris Cherny 公开宣布自己卸载了 IDE。一时间&#xff0c;Vibe Coding 成了全行业最热的话题。6个月后&#xff0c;当我们回过头来拉一份真实账本&#xff0c;发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言&#xff1a;审计结束三个月了&#xff0c;审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间&#xff0c;内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中&#xff0c;审计…

2026/6/28 0:08:01阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月&#xff0c;Boris Cherny 公开宣布自己卸载了 IDE。一时间&#xff0c;Vibe Coding 成了全行业最热的话题。6个月后&#xff0c;当我们回过头来拉一份真实账本&#xff0c;发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言&#xff1a;审计结束三个月了&#xff0c;审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间&#xff0c;内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中&#xff0c;审计…

2026/6/28 0:08:01阅读更多 →