opencv动态目标检测

文章目录

  • 前言
  • 一、效果展示
  • 二、实现方法
      • 构造形态学操作所需的核:
      • 创建背景减除模型:
      • 形态学操作:
      • 轮廓检测:
  • 三、代码
    • python代码
    • C++代码
  • 总结
  • 参考文档


前言

很久没更新文章了,这次因为工作场景需要检测动态目标,特此记录一下。


一、效果展示

在这里插入图片描述

二、实现方法

基于OpenCV库的背景减除方法实现的视频中的移动目标检测示例。通过从输入视频中提取前景目标,然后在特定区域内绘制检测到的移动物体的边界框。主要函数方法如下:

构造形态学操作所需的核:

cv2.getStructuringElement: 创建形态学操作所需的结构元素,这里使用椭圆形的结构元素。

创建背景减除模型:

cv2.createBackgroundSubtractorMOG2(): 创建一个高斯混合模型背景减除器,用于提取视频中的前景。

形态学操作:

cv2.morphologyEx(fgmk, cv2.MORPH_OPEN, kernel): 对前景图像进行形态学开运算,用于去除噪声并平滑前景目标。

轮廓检测:

cv2.findContours(fgmk.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE): 寻找前景图像中的轮廓。

三、代码

需要根据自己的视频适当微调参数

python代码

import cv2
import numpy as npdef main(path):# 第一步:使用cv2.VideoCapture读取视频camera = cv2.VideoCapture(path)width = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))per_width = int(width / 4)per_height = int(height / 2)# 第二步:cv2.getStructuringElement构造形态学使用的kernelkernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))# 第三步:构造高斯混合模型model = cv2.createBackgroundSubtractorMOG2()# model = cv2.createBackgroundSubtractorKNN()# 设定区域,后面可以用于判断是否在区域内(可以设置为多边形)contour = np.array([[0, 0], [3 * per_width, per_height], [3 * per_width, height], [0, height]])while True:# 第四步:读取视频中的图片,并使用高斯模型进行拟合ret, frame = camera.read()# 运用高斯模型进行拟合,在两个标准差内设置为0,在两个标准差外设置为255fgmk = model.apply(frame)# 第五步:使用形态学的开运算做背景的去除fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_OPEN, kernel)# 第六步:cv2.findContours计算fgmk的轮廓contours, hierarchy = cv2.findContours(fgmk.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)  # 该函数计算一幅图像中目标的轮廓for c in contours:# 过滤面积较小的扰动if cv2.contourArea(c) < 80:continueelse:x, y, w, h = cv2.boundingRect(c)  # 该函数计算矩形的边界框center = (int(x + w / 2), int(y + h / 2))# 判断点是否在多边形区域内result = cv2.pointPolygonTest(contour, center, False)if result > 0:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)# 第八步:进行图片的展示cv2.imshow('fgmk', fgmk)cv2.imshow('frame', frame)if cv2.waitKey(1) & 0xff == 27:breakcamera.release()cv2.destroyAllWindows()if __name__ == '__main__':path = "./video/test.mp4"main(path)

C++代码

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main(int argc, char** argv) {string path = "../test2.mp4";// 第一步:使用VideoCapture读取视频VideoCapture camera(path);int width = static_cast<int>(camera.get(CAP_PROP_FRAME_WIDTH));int height = static_cast<int>(camera.get(CAP_PROP_FRAME_HEIGHT));int per_width = width / 4;int per_height = height / 2;// 第二步:getStructuringElement构造形态学使用的kernelMat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));// 第三步:构造高斯混合模型Ptr<BackgroundSubtractorMOG2> model = createBackgroundSubtractorMOG2();// Ptr<BackgroundSubtractorKNN> model = createBackgroundSubtractorKNN();// 设定区域,后面可以用于判断是否在区域内(可以设置为多边形)vector<Point> contour = {Point(0, 0), Point(3 * per_width, per_height), Point(3 * per_width, height), Point(0, height)};while (true) {// 第四步:读取视频中的图片,并使用高斯模型进行拟合Mat frame;bool ret = camera.read(frame);if (!ret) break;// 运用高斯模型进行拟合,在两个标准差内设置为0,在两个标准差外设置为255Mat fgmk;model->apply(frame, fgmk);// 第五步:使用形态学的开运算做背景的去除morphologyEx(fgmk, fgmk, MORPH_OPEN, kernel);// 第六步:findContours计算fgmk的轮廓vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(fgmk.clone(), contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);for (const auto& c : contours) {if (contourArea(c) < 80)continue;else {Rect rect = boundingRect(c);Point center(rect.x + rect.width / 2, rect.y + rect.height / 2);// 判断点是否在多边形区域内double result = pointPolygonTest(contour, center, false);if (result > 0)rectangle(frame, rect, Scalar(0, 0, 255), 2);}}// 第八步:进行图片的展示imshow("fgmk", fgmk);imshow("frame", frame);if (waitKey(1) == 27) // 按下ESC键退出break;}camera.release();destroyAllWindows();return 0;
}

总结

这段代码演示了背景减除方法在移动目标检测中的应用,通过检测前景目标并在特定区域内绘制边界框,可以用于一些简单的运动分析和目标跟踪应用。

参考文档

https://blog.csdn.net/Gavinmiaoc/article/details/96474368
https://blog.csdn.net/drippingstone/article/details/116186462
如果阅读本文对你有用,欢迎一键三连呀!!!
2023年8月9日17:15:40
在这里插入图片描述

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

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

相关文章

Smartbi 权限绕过漏洞复现(QVD-2023-17461)

0x01 产品简介 Smartbi大数据分析产品融合BI定义的所有阶段&#xff0c;对接各种业务数据库、数据仓库和大数据分析平台&#xff0c;进行加工处理、分析挖掘和可视化展现&#xff1b;满足所有用户的各种数据分析应用需求&#xff0c;如大数据分析、可视化分析、探索式分析、复杂…

【积水成渊】uniapp高级玩法分享

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

JavaEE——网络初识 (简单介绍两种协议以及网络通信的基础概念)

文章目录 一、简单了解网络发展二、网络通信基础认识三、利用UDP举例解释网络信息传输 一、简单了解网络发展 总的来讲&#xff0c;网络的发展史就是&#xff0c;先是一小部分的计算机之间连接通信&#xff0c;随着技术发展&#xff0c;逐渐扩大范围&#xff0c;形成了我们当前…

ROS实现机器人移动

开源项目 使用是github上六合机器人工坊的项目。 https://github.com/6-robot/wpr_simulation.git 机器人运动模型 运动模型如下所示&#xff1a;&#x1f447; 机器人运动的消息包&#xff1a; 实现思路&#xff1a;&#x1f447;   为什么要使用/cmd_vel话题。因为这…

Tcp的粘包和半包问题及解决方案

目录 粘包&#xff1a; 半包&#xff1a; 应用进程如何解读字节流&#xff1f;如何解决粘包和半包问题&#xff1f; ①&#xff1a;固定长度 ②&#xff1a;分隔符 ③&#xff1a;固定长度字段存储内容的长度信息 粘包&#xff1a; 一次接收到多个消息&#xff0c;粘包 应…

FFmpeg 硬编码VideoToolBox流程

介绍 FFmpeg已经提供对 VideoToolBox 的编解码支持&#xff1b;主要涉及到的文件有videotoolbox.c、videotoolbox.h、videotoolboxenc.c、ffmepg_videotoolbox.c。在编译 FFmpeg 源码时&#xff0c;想要支持VideoToolBox&#xff0c;在 configure 时&#xff0c;需要–enable-…

AcWing算法提高课-1.3.17背包问题求具体方案

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 有 N N N 件物品和一个容量是 V V V 的背包。每件物品只能使用一次。 第 i i i 件物品的体积是 v i v_i vi​&#xff0c;价值…

2023年,App运行小游戏,可以玩出什么创意?

疫情过后&#xff0c;一地鸡毛。游戏行业的日子也不好过。来看看移动游戏收入&#xff1a;2022年&#xff0c;移动游戏收入达到920亿美元&#xff0c;同比下降6.4%。这告诉我们&#xff0c;2022年对移动游戏市场来说是一个小挫折。 但不管是下挫还是上升&#xff0c;移动游戏市…

Mac unsupported architecture

&#xff08;瓜是长大在营养肥料里的最甜&#xff0c;天才是长在恶性土壤中的最好。——培根&#xff09; unsupported architecture 在mac的m系列芯片中容易出现此类问题&#xff0c;因为m系列是arm64的芯片架构&#xff0c;而有些nodejs版本或npm包的芯片架构是x86的&#x…

解码大众全新数字高尔夫8汽车CAN FD行驶功能电气架构

据在大众原厂的伙伴介绍&#xff0c;全新数字高尔夫8将在11月上市销售&#xff0c;目前高尔夫8在行驶功能电气架构上采用的CAN FD&#xff0c;在多媒体这一块采用的以太网&#xff0c;后续估计大部分类似同样MQBEvo平台的车型均会复制升级过来&#xff0c;那么&#xff0c;未来…

福布斯发布2023云计算100强榜单,全球流程挖掘领导者Celonis排名17

近日&#xff0c;全球流程挖掘领导者Celonis入选福布斯2023 年云计算 100 强榜单&#xff0c;估值130亿美元&#xff0c;排名第17&#xff0c;Celonis已经是连续三年跻身榜单前20名。 本次榜单由福布斯与Bessemer Venture Partners和Salesforce Ventures联合发布&#xff0c;旨…

OSPF 动态路由协议 路由传递

影响OSPF路由选择的因素&#xff1a; 1.OSPF路由的开销值&#xff1a;宽带参考值默认为100. COST1000/接口带宽。此时接口 带宽的值可更改&#xff0c;更改后只改变参考数值&#xff0c;带宽仍然为初始值。 注意&#xff1a;更改COST需要 在路由的入方向&#xff0c;数据的出方…