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

news2024/11/15 10:29:28

车辆检测

  • 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))) & 0xff
    if 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:
            continue
        cv2.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 = 0


def center(x, y, w, h):
    x1 = x+w/2
    y1 = y+h/2
    return x1, y1


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


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:
            continue
        cv2.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:
            continue
        cv2.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 + 1
                cars.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))) & 0xff
    if key == 27:
        break  # 按ESC退出


# 释放资源
cap.release()
cv2.destroyAllWindows(

在这里插入图片描述


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马头条2

文章目录 前言一、接口工具1.1 postman1.2 swagger1.3 knife4j 二、 网关一、基本搭建二、全局过滤器jwt 三、 前端集成导入前端工程项目安装nginx测试 &#x1f315;博客x主页&#xff1a;己不由心王道长&#x1f315;! &#x1f30e;文章说明&#xff1a;黑马头条开发&#x…

一站式数据可观测性平台 Datavines 正式开源啦

Datavines是一站式开源数据可观测性平台&#xff0c;提供元数据管理、数据概览报告、数据质量管理&#xff0c;数据分布查询、数据趋势洞察等核心能力&#xff0c;致力于帮助用户全面地了解和掌管数据&#xff0c;让您做到心中有数&#xff0c;目前作为 Datavane 开源组织的重点…

Java ForkJoin 简介和应用

Java 并行框架 Fork Join 一.Fork Join 简介1.框架说明2.任务说明 二.应用示例1.RecursiveTask分组示例分组求和 2.RecursiveAction3.CountedCompleter 三.ForkJoin 实践代码测试1.测试用 Excel 文件2.读取结果 一.Fork Join 简介 1.框架说明 ForkJoinPool 继承自 AbstractEx…

【Java-SpringBoot+Vue+MySql】Day4-VUE框架使用

一、VUE入门 1、环境准备 2、预备知识 3、实战演练 vue官网 Vue.js - 渐进式 JavaScript 框架 | Vue.js 基础语法&#xff0c;vue2和vue3区别不大&#xff0c;但是后面路由会有很大区别。 前期基础语法&#xff0c;我们通过链接的方式使用vue&#xff0c;后面会用npm进行安装…

Transformer-XL模型简单介绍

目录 一、前言 二、整体概要 三、细节描述 3.1 状态复用的块级别循环 3.2 相对位置编码 四、论文链接 一、前言 以自注意力机制为核心的 Transformer 模型是各种预训练语言模型中的主要组成部分。自注意力机制能够构建序列中各个元素之间的上下文关联程度&#xff0c;挖掘…

java 2023秒杀项目 day(1) 面经

java 2023杀项目 day(1) 面经 一、秒杀项目1.1 如何设计秒杀系统1.2 数据库 二、业务2.1 登录2.2.1 密码加密 2.2.2 密码参数校验2.2.3 分布式session2.2.3.1 解决方案 2.2.4 参数解析器 2.3 异常处理2.3.1 ControllerAdvicerExceptionHandler 2.4 秒杀2.4.1 逻辑2.4.1 秒杀前判…

图像处理——以支票识别为例

用到环境 1、pycharm community edition 2022.3.2 2、Python 3.10 后续应该会在资源上传项目&#xff0c;需要的话可以私信我。 流程 图1 扩展实验“金额识别”流程图 正文 导入 cv2、pytesseract、re 和 locale 模块。 使用 cv2.imread() 函数加载名为 cheque.jpg 的支票图像…

ROS:结构

目录 前言一、设计者二、维护者三、系统架构四、ROS自身结构 前言 从不同的角度&#xff0c;对ROS架构的描述也是不同的&#xff0c;一般我们可以从设计者、维护者、系统结构与自身结构4个角度来描述ROS结构: 一、设计者 ROS设计者将ROS描述为“ROS Plumbing Tools Capab…

数仓工具Hive 概述

Hive Hive简介Hive架构HiveSQL语法不同之处建表语句查询语句 Hive查看执行计划Hive文件格式 Hive简介 Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 通过Hive可以将mapred…

数字IC前端学习笔记:仲裁轮询(三)

相关文章 数字IC前端学习笔记&#xff1a;LSFR&#xff08;线性反馈移位寄存器&#xff09; 数字IC前端学习笔记&#xff1a;跨时钟域信号同步 数字IC前端学习笔记&#xff1a;信号同步和边沿检测 数字IC前端学习笔记&#xff1a;锁存器Latch的综合 数字IC前端学习笔记&am…

mitmproxy抓包原理

文章目录 mitmproxy原理详解1 mitmproxy 基本原理2 作为中间代理获取HTTP请求信息2.1 应对显式HTTP请求2.2 应对隐式HTTP请求 3 作为中间代理获取HTTPS请求信息3.1 显式HTTPS请求1) 获取远程主机名2) 处理主题备用名称SAN3) 处理服务器名称指示SNI4) 显式HTTPS请求信息获取整个…

基于深度学习的高精度烟雾检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度烟雾检测识别系统可用于日常生活中或野外来检测与定位烟雾目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的烟雾目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

为什么数据库字段建议设置为NOT NULL?

目录 一、性能 二、开发的友好性 三、聚合函数不准确 四、null与其它值计算 五、distinct、group by、order by的问题 六、索引问题 七、其它问题 一、性能 如果查询中包含可为null的列&#xff0c;对MYSQL来说更难优化&#xff0c;因为可为null的列使得索引、索引统计…

NUCLEO-F411RE RT-Thread 体验 (9) - GCC环境 PWM的驱动移植以及简单使用

NUCLEO-F411RE RT-Thread 体验 (9) - GCC环境 PWM的驱动移植以及简单使用 驱动移植 驱动位于drv_pwm.c文件中&#xff0c;components层代码位于rt_drv_pwm.c中。 修改Makefile文件 修改配置文件rtconfig.h LED2链接PA5&#xff0c;而TIM2_CHANNEL1可从PA5输出PWM&#xff0…

ubuntu命令

查看当前用户 whoami 进入root权限 sudo su 修改用户名密码 sudo passwd username #修改用户密码 //username是用户设置用户名&#xff0c;记得替换 sudo passwd root #修改root密码 https://blog.csdn.net/m0_54647521/article/details/127521032 重启…

图形编辑器开发:以光标位置缩放画布

大家好&#xff0c;我是前端西瓜哥。 画布缩放是图形设计工具中很重要的基础能力。 通过它&#xff0c;我们可以像举着一台摄影机&#xff0c;在图形所在的世界到处游逛&#xff0c;透过镜头&#xff0c;可以只看自己想看的图形&#xff1b;可以拉近摄影机&#xff0c;看到图…

SpringBoot 如何使用 @ControllerAdvice 注解进行全局异常处理

SpringBoot 如何使用 ControllerAdvice 注解进行全局异常处理 在 Web 开发中&#xff0c;异常处理是非常重要的一环。在 SpringBoot 框架中&#xff0c;我们通常使用 ExceptionHandler 注解来处理 Controller 层的异常。但是&#xff0c;如果想要处理全局异常&#xff0c;我们…

【MySql】MySql事务常见操作

文章目录 准备工作事务常见操作方式总结 准备工作 将mysql的默认隔离级别设置成读未提交 set global transaction isolation level read uncommitted;注意&#xff1a;设置完毕之后&#xff0c;需要重启终端&#xff0c;进行查看 select tx_isolation 创建测试表 mysql>…

HTML5 的新特性

html基础知识html基础知识_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客html5的新特性HTML5 的新特性_上半场结束&#xff0c;中场已休息&#xff0c;下半场ing的博客-CSDN博客 目录 1.0 HTML5 的新特性 1.1 HTML5 新增的语义化标签 1.2 HTML5 新增的…

LabVIEW何得知是谁在连接远程前面板

LabVIEW何得知是谁在连接远程前面板 想要知道连接远程前面板的用户的身份。如何来得知用户的身份和他们连接远程前面板的时间&#xff1f; 解答: 可以使用Remote Panel: Connections To Clients属性或者Remote Panel Client Connections方法来得知连接远程面板用户的身份。Re…