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

基于OpenCV-车辆检测项目(简易版)

车辆检测

  • 1.项目介绍
  • 2. 读取一段视频
  • 3.通过形态学处理识别车辆
  • 4.描画轮廓
  • 5. 车辆计数并显示

本项目使用的视频地址链接

1.项目介绍

对一个视频进行车辆数量的检测,用到的知识有视频的读取,滤波器,形态学,添加直线、文本;项目流程为:1.读取一段视频。2.通过形态学处理识别车辆。3.对车辆进行计数。4.显示车辆统计信息。

2. 读取一段视频

在进行车辆检测之前,首先要把视频读进来。
代码如下:

import cv2
import numpy as np# 创建视频帧对象
cap = cv2.VideoCapture('./video/video.mp4')
# 检测视频是否被打开
if not cap.isOpened():print('video open failed')exit(0)
# 循环读取图片
while True:ret, frame = cap.read()# 检测是否正确读取视频帧if not ret:print('视频帧读取有误')break# 读取正确cv2.imshow('frame', frame)# 视频播放速度过快,该成正常速度# key = cv2.waitKey(1) & 0xff 播放过快key = cv2.waitKey(int(1000/cap.get(cv2.CAP_PROP_FPS))) & 0xffif key == 27:break # 按ESC退出# 释放资源
cap.release()
cv2.destroyAllWindows()

3.通过形态学处理识别车辆

先将彩色图像转化为灰度图,然后高斯滤波,接着去背景获得前景,接着通过腐蚀腐蚀图中小斑点,然后再膨胀,用闭运算去除图案里面的小方块。得到一个可以识别的图像。

def bodyResize(img):# 将图像转化为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用高斯滤波去噪blur = cv2.GaussianBlur(gray, (5, 5), 0)# 去背景mask = bgsubmog.apply(blur)# 腐蚀去掉图中的小方块erode = cv2.erode(mask, kernel, iterations=1)# 膨胀放大dilate = cv2.dilate(erode, kernel, iterations=3)# 闭操作,去掉物体内部的小方块close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)close = cv2.morphologyEx(close, cv2.MORPH_CLOSE, kernel)return close

处理过后如图所示:白色的为车辆。
在这里插入图片描述

4.描画轮廓

首先要检测出轮廓,然后根据得到的轮廓画矩形,为了防止矩形太多,过滤掉太小的矩形。

def drawContours(img, points):# 根据轮廓画矩形for (i, points) in enumerate(contours):#print(i, points)# 画最大外接矩形,太小就不画x, y, w, h = cv2.boundingRect(points)if w < min_w and h < min_h:continuecv2.rectangle(frame, (x, y), (x+w, y+h),(255, 0, 0), 2)

5. 车辆计数并显示

首先把车辆看成一个个矩形,然后算出矩形的中心点,中心点过直线就统计成一辆车,最后将计数打印在图片上。完整版代码如下。

import cv2
import numpy as np# 矩形最小宽高
min_w = 90
min_h = 90# 存储有效车辆的数组
cars = []
# 设置线高
line_high = 600
# 偏移量
offest = 9# 车的数量
count = 0def center(x, y, w, h):x1 = x+w/2y1 = y+h/2return x1, y1def bodyResize(img):# 将图像转化为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用高斯滤波去噪blur = cv2.GaussianBlur(gray, (5, 5), 0)# 去背景mask = bgsubmog.apply(blur)# 腐蚀去掉图中的小方块erode = cv2.erode(mask, kernel, iterations=1)# 膨胀放大dilate = cv2.dilate(erode, kernel, iterations=3)# 闭操作,去掉物体内部的小方块close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)close = cv2.morphologyEx(close, cv2.MORPH_CLOSE, kernel)return closedef drawContours(img, points):# 根据轮廓画矩形for (i, points) in enumerate(contours):#print(i, points)# 画最大外接矩形,太小就不画x, y, w, h = cv2.boundingRect(points)if w < min_w and h < min_h:continuecv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)# 创建视频帧对象
cap = cv2.VideoCapture('./video/video.mp4')
# 创建去背景的对象
bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()
# 卷积核大小
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 检测视频是否被打开
if not cap.isOpened():print('video open failed')exit(0)
# 循环读取图片
while True:ret, frame = cap.read()# 检测是否正确读取视频帧if not ret:print('视频帧读取有误')break# 下面都是读取正确的车辆# 画直线,用来统计车cv2.line(frame, (10, line_high), (1270, line_high), (0, 0, 255), 2)# 进行形态学处理close = bodyResize(frame)# 检测轮廓contours, hier = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 根据轮廓画矩形for (i, points) in enumerate(contours):# print(i, points)# 画最大外接矩形,太小就不画x, y, w, h = cv2.boundingRect(points)if w < min_w and h < min_h:continuecv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)# 统计车辆数量# 求出车的中心点cen_point = center(x, y, w, h)cars.append(cen_point)# 统计过直线的车的数量for (x, y) in cars:if(y > line_high - offest) and (y < line_high + offest):count = count + 1cars.remove((x, y))# print(count)# 将count打印在屏幕上cv2.putText(frame, "count = "+str(count), (500, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,0,0), 5)cv2.imshow('frame', frame)# cv2.imshow('resize', close)# 视频播放速度过快,该成正常速度# key = cv2.waitKey(1) & 0xff 播放过快key = cv2.waitKey(int(1000/cap.get(cv2.CAP_PROP_FPS))) & 0xffif key == 27:break  # 按ESC退出# 释放资源
cap.release()
cv2.destroyAllWindows(

在这里插入图片描述


此项目仅供个人练习使用,目的是加强对OpenCV的各种API的理解,本项目是基于传统图像处理,还存在较大缺陷,比如极端情况计数不准等问题,后续优化还可以依据深度学习等模型来训练,如有问题,欢迎在评论区讨论。

相关文章:

基于OpenCV-车辆检测项目(简易版)

车辆检测 1.项目介绍2. 读取一段视频3.通过形态学处理识别车辆4.描画轮廓5. 车辆计数并显示 本项目使用的视频地址链接 1.项目介绍 对一个视频进行车辆数量的检测&#xff0c;用到的知识有视频的读取&#xff0c;滤波器&#xff0c;形态学&#xff0c;添加直线、文本&#xff…...

用python获取海康摄像机视频

要调用海康摄像机视频&#xff0c;需要使用海康SDK提供的API。以下是一个简单的示例代码&#xff0c;可以连接到海康摄像机并获取视频流&#xff1a; python import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel from PyQt5.QtGui import QPixmap from PyQ…...

【Linux】遇事不决,可先点灯,LED驱动的进化之路---2

【Linux】遇事不决&#xff0c;可先点灯&#xff0c;LED驱动的进化之路---2 前言&#xff1a; 一、Pinctrl子系统重要概念 1.1 重要概念 1.1.1 pin controller 1.1.2 client device 1.1.3 补充概念 二、GPIO子系统重要概念 2.1 在设备树指定GPIO引脚 2.2 在驱动代码中…...

【计算机网络】数据链路层--点对点协议PPP

1.概念 2.构成 3.封装成帧 - 帧格式 4.透明传输 4.1字节填充法&#xff08;面向字节的异步链路&#xff09; 4.2.比特填充法&#xff08;面向比特的同步链路&#xff09; 5.差错检测 6.工作状态 7.小结...

【⑦MySQL】· 一文了解四大子查询

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL标量/单行子查询、列子/表子查询的讲解✨ 目录 前言一、子查询概念二、标量/单行子查询、列子/表子查询三、总结 一、子查询概念 子查询指一个查询语句嵌套在另一个查询语句内部的查询&#xff0c;这个特性从My…...

ValSuite报告可以帮助改善您的验证过程的6种方式

热验证工艺是一项复杂而微妙的工作&#xff0c;但它是确保制药和生物技术产品的安全性和有效性的重要组成部分。同时&#xff0c;管理整个验证过程中产生的数据可能很费时&#xff0c;而且容易出错——这就是ValSuite的意义。 这款直观的验证软件简化了数据分析和报告&#xf…...

【机器学习】机器故障的二元分类模型-Kaggle竞赛

竞赛介绍 数据集描述 本次竞赛的数据集&#xff08;训练和测试&#xff09;是从根据机器故障预测训练的深度学习模型生成的。特征分布与原始分布接近&#xff0c;但不完全相同。随意使用原始数据集作为本次竞赛的一部分&#xff0c;既可以探索差异&#xff0c;也可以了解在训…...

ADB usage

查看手机设备的信息 获取设备的Android版本号 adb shell getprop ro.build.version.release 获取设备的API版本号 adb shell getprop ro.build.version.sdkAdb 获得 sdk版本 adb shell getprop ro.build.version.sdk27 Adb 获得Android版本 adb shell getprop ro.build.vers…...

利用有限元法(FEM)模拟并通过机器学习进行预测以揭示增材制造过程中热场变化:基于ABAQUS和Python的研究实践

1. 引言 增材制造&#xff08;Additive Manufacturing&#xff0c;AM&#xff09;近年来引起了大量的研究关注&#xff0c;这主要是因为它可以提供定制化、复杂结构的零件制造解决方案。在AM过程中&#xff0c;热场的分布和变化直接影响了零件的质量和性能。对此&#xff0c;采…...

Kafka与Flume的对比分析

Kafka与Flume的对比分析 一、Kafka和Flume1. Kafka架构2. Flume架构3. Kafka和Flume异同点 二、Kafka和Flume的性能对比1. 数据处理性能对比2. 大规模数据流处理的性能对比 三、性和稳定性对比1. 高可用集群的搭建KafkaFlume 2. 数据丢失和重复消费的问题处理KafkaFlume 四、适…...

docker启动redis哨兵报错(sentinel.conf is not writable: Permission denied)

Sentinel config file /usr/local/sentinel/sentinel.conf is not writable: Permission denied. Exiting… 用这个命令不报错&#xff1a;docker run --net host -p 6666:6666–name redis-sentinel -v /usr/mcc/redis/conf:/usr/local/sentinel/ -v /usr/mcc/redis/data/sent…...

如何编写优秀代码

最近在阅读别人写的代码&#xff0c;进行相应功能的修改。发现很多不规范或者比较绕的地方&#xff0c;总有那么几句看着多此一举&#xff0c;阅读别人的代码就是这样&#xff0c;有时候真的不懂写代码的人当时怎么想的。 例如有这么一段&#xff1a; 用户输入一个名字&#…...

信道编码:Matlab RS编码、译码使用方法

Matlab RS编码、译码使用方法 1. 相关函数 在MATLAB中进行RS编码的过程可以使用rsenc()函数或者comm.RSEncoder()函数。 1.1 rsenc()函数使用方法 在MATLAB中帮助中可以看到有三种使用形式&#xff0c;分别为 code rsenc(msg,n,k) code rsenc(msg,n,k,genpoly) code rs…...

数据结构第六章 图 6.1-6.3 错题整理

6.1 6.C 加上一个点实现非连通 去除每个边都是一颗不同的生成树 一共n条边 13.C n个顶点、e条边的无向图&#xff0c;森林。树的角度看&#xff0c;除了根节点没有一条边与其对应&#xff0c;其他顶点都对应一条边&#xff0c;用顶点-边得出有多少颗树 14.A II 等于 也可以…...

12 MFC常用控件(一)

文章目录 button 按钮设置默认按钮按下回车后会响应禁用开启禁用设置隐藏设置显示设置图片设置Icon设置光标 Cbutton 类创建按钮创建消息单选按钮多选按钮 编辑框组合框下拉框操作 CListBox插入数据获取当前选中 CListCtrl插入数据设置表头修改删除 button 按钮 设置默认按钮按…...

Springboot搭配Redis实现接口限流

目录 介绍 限流的思路 代码示例 必需pom依赖 自定义注解 redis工具类 redis配置类 主拦截器 注册拦截器 介绍 限流的需求出现在许多常见的场景中&#xff1a; 秒杀活动&#xff0c;有人使用软件恶意刷单抢货&#xff0c;需要限流防止机器参与活动 某 api 被各式各样…...

php中的双引号与单引号的基本使用

字符串,在各类编程语言中都是一个非常重要的数据类型 网页当中的图片,文字,特殊符号,HTMl标签,英文等都属于字符串 PHP字符串变量用于存储并处理文本, 在创建字符串之后&#xff0c;我们就可以对它进行操作。我们可以直接在函数中使用字符串&#xff0c;或者把它存储在变量中 字…...

【Neo4j教程之CQL命令基本使用】

&#x1f680; Neo4j &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;C…...

Apikit 自学日记:发起文档测试-TCP/UDP

进入某个TCP/UDP协议的API文档详情页&#xff0c;点击文档上方 测试 标签&#xff0c;即可进入 API 测试页&#xff0c;系统会根据API文档的定义的求头部、Query参数、请求体自动生成测试界面并且填充测试数据。 填写/修改请求参数 1.1设置请求参数 与发起HTTP协议测试类似&am…...

坚鹏:中国邮储银行金融科技前沿技术发展与应用场景第1期培训

中国邮政储蓄银行金融科技前沿技术发展与应用场景第1期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力&#xff0c;是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市&#xff0c;2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...