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.rhkb.cn/news/83672.html

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

相关文章

图的深度优先遍历和广度优先遍历

目录 图的创建和常用方法 深度优先遍历&#xff08;Depth First Search&#xff09; 广度优先遍历&#xff08;Broad First Search&#xff09; 图的创建和常用方法 //无向图 public class Graph {//顶点集合private ArrayList<String> vertexList;//存储对应的邻接…

JVM工作的总体机制概述

JDK、JRE、JVM关系回顾 JVM&#xff1a;Java Virtual Machine&#xff0c;翻译过来是Java虚拟机JRE&#xff1a;Java Runtime Environment&#xff0c;翻译过来是Java运行时环境 JREJVMJava程序运行时所需要的类库JDK&#xff1a;Java Development Kits&#xff0c;翻译过来是…

进程 的初识

程序和进程有什么区别 程序是静态的概念&#xff0c;gcc xxx.c -o pro 磁盘中生成的文件&#xff0c;叫做程序。进程是程序的一次运行活动&#xff0c;通俗点的意思就是程序跑起来了&#xff0c;系统中就多了一个进程。 如何查看系统中有哪些进程 使用 ps 指令&#xff08;完整…

解决vue3+echarts关于无法获取dom宽度和高度的问题

解决vue3echarts关于无法获取dom宽度和高度的问题 近期写vue3项目&#xff0c;很多地方都用到了echarts&#xff0c;刚开始写的时候&#xff0c;发现图一直出不来&#xff0c;报错/报警内容一般有两项&#xff1a; Uncaught (in promise) Error: Initialize failed: invalid …

恒盛策略:欧洲能源危机又来?天然气价格飙升,受益板块曝光

储能板块有望获益。 今日早盘煤炭、交通运输、石油石化等板块涨幅均超1%&#xff0c;其中煤炭板块涨1.37%位居第一位。音讯面上&#xff0c;欧佩克重申减产战略&#xff0c;世界原油价格升至3个月来高位。此外&#xff0c;隔夜欧洲天然气期货跳涨40%&#xff0c;创2022年3月以来…

7.6 通俗易懂解读残差网络ResNet 手撕ResNet

一.举例通俗解释ResNet思想 假设你正在学习如何骑自行车&#xff0c;并且想要骑到一个遥远的目的地。你可以选择直接骑到目的地&#xff0c;也可以选择在途中设置几个“中转站”&#xff0c;每个中转站都会告诉你如何朝着目的地前进。 在传统的神经网络中&#xff0c;就好比只…

如何设置文字颜色和背景颜色?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 设置文字颜色&#xff08;color属性&#xff09;⭐ 设置背景颜色&#xff08;background-color属性&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你…

关于丢失安卓秘钥的撞sha-1值的办法

实验得知&#xff0c;安卓sha-1和keytool生成秘钥签名文件的时间有关。 前提条件是&#xff0c;开发者必须知道生成秘钥的所有细节参数 以下是撞文件代码&#xff08;重复生成&#xff09; import time import osidx 0while True:cmdkeytool -keyalg RSA -genkeypair -alia…

机器学习实战2决策树算法

文章目录 决策树算法核心是要解决两个的关键问题sklearn中的决策树模型sklearn建模步骤分类树Criterionrandom_state && splitter剪枝参数max_depthmin_samples_leaf&&min_samples_splitmax_features&&min_impurity_decrease确认最优剪枝参数目标权重参…

【LangChain学习】基于PDF文档构建问答知识库(三)实战整合 LangChain、OpenAI、FAISS等

接下来&#xff0c;我们开始在web框架上整合 LangChain、OpenAI、FAISS等。 一、PDF库 因为项目是基于PDF文档的&#xff0c;所以需要一些操作PDF的库&#xff0c;我们这边使用的是PyPDF2 from PyPDF2 import PdfReader# 获取pdf文件内容 def get_pdf_text(pdf):text "…

建材陶瓷片机器视觉定位软硬件方案

【检测目的】 建材陶瓷片机器视觉定位 【检测要求】 精度0.02mm 产品大小&#xff1a;60mm—70mm 颜色为&#xff1a;白、绿两种 5S图像处理时间 【拍摄效果图一】 上料位 【拍摄效果图二】 上料位 【拍摄效果图三】 上料位 【拍摄效果图四】 上料位 【硬件配置】 外框 …

C++初阶——函数重载

前言&#xff1a;C中除了可以在不同的命名空间中使用同名函数&#xff0c;还有一种支持在同一个作用域中同名函数的方式——函数重载。 函数重载 一.什么是函数重载&#xff1f;二.函数重载的3种规则三.特殊情况 一.什么是函数重载&#xff1f; C允许同样同一作用域中声明几个功…

爬虫ip池越大越好吗?

作为一名资深的程序员&#xff0c;今天我要给大家分享一些关于爬虫ip池的知识。关于ip代理池的问题&#xff0c;答案是肯定的&#xff0c;池子越大越好。下面跟我一起来盘点一下ip池大的好处吧&#xff01; 1、提高稳定性 爬虫ip池越大&#xff0c;意味着拥有更多可用的爬虫ip…

HCIA---路由器--静态路由

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 一.路由器简介 二.路由器转发原理 三.骨干链路 四.路由分类 五.静态路由 总结 一.路由器简介 路由器是一种网络设备&#xff0c;用于将数据包从一个网络发送…

【Linux】UDP协议——传输层

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号 两个问题 netstat与iostat pidof UDP协议 UDP协议格式 UDP协议的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 传输层 在学习HTTP等应用层协议时&#xff0c;为了便于理解&#xff…

git的简单介绍和使用

git学习 1. 概念git和svn的区别和优势1.1 区别1.2 git优势 2. git的三个状态和三个阶段2.1 三个状态&#xff1a;2.2 三个阶段&#xff1a; 3. 常用的git命令3.1 下面是最常用的命令3.2 git命令操作流程图如下&#xff1a; 4. 分支内容学习4.1 项目远程仓库4.2 项目本地仓库4.3…

线上电影购票选座H5小程序源码开发

搭建一个线上电影购票选座H5小程序源码需要一些基本的技术和步骤。以下是一个大致的搭建过程&#xff0c;可以参考&#xff1a; 1. 确定需求和功能&#xff1a;首先要明确你想要的电影购票选座H5小程序的需求和功能&#xff0c;例如用户登录注册、电影列表展示、选座购票、订单…

编程中的宝藏:二分查找

二分查找 假设你需要在电话簿中找到一个以字母 “K” 开头的名字&#xff08;虽然现在谁还在用电话簿呢&#xff01;&#xff09;。你可以从头开始翻页&#xff0c;直到进入以 “K” 打头的部分。然而&#xff0c;更明智的方法是从中间开始&#xff0c;因为你知道以 “K” 打头…

Unity游戏源码分享-仿开心消消乐Match3Jewel

Unity游戏源码分享-仿开心消消乐Match3Jewel 工程地址&#xff1a; https://download.csdn.net/download/Highning0007/88198762

Oracle DB 安全性 : TDE HSM TCPS Wallet Imperva

• 配置口令文件以使用区分大小写的口令 • 对表空间进行加密 • 配置对网络服务的细粒度访问 TCPS 安全口令支持 Oracle Database 11g中的口令&#xff1a; • 区分大小写 • 包含更多的字符 • 使用更安全的散列算法 • 在散列算法中使用salt 用户名仍是Oracle 标识…