OpenCV实例(七)汽车检测

OpenCV实例(七)汽车检测

  • 1.概述
  • 2.代码实例
  • 3.代码功能

作者:Xiou

1.概述

对于图像和视频检测中的目标类型并没有具体限制,但是,为了使结果的准确度在可接受范围内,需要一个足够大的数据集,包括训练图像的大小要一样。如果由自己构建这样的数据集(这是完全可能的)将会非常耗时。

可利用现成的数据集,在网上可以免费下载许多这样的数据集:

·The University or Illinois:

http://l2r.cs.uiuc.edu/cogcomp/Data/Car/CarData.tar.gz

·Stanford University:

http://ai.stanford.edu/~jkrause/cars/car_dataset.html

2.代码实例

需要实现功能:
1、识别出图片中的汽车对象
2、对车辆进行统计,并将统计结果展示出来

涉及到的知识点:
图像和视频的加载、展示;
基本图像绘制;
基本图像运算与处理;
形态学处理(比如降噪、腐蚀膨胀);
轮廓查找。

import cv2
import numpy as np
 
# 加载视频
cap = cv2.VideoCapture('../img/video.mp4')
 
# 背景去除
bgsubmog = cv2.createBackgroundSubtractorMOG2()
 
# 创建腐蚀膨胀的卷积核
k = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 设置最小宽高阈值
min_w, min_h = 90, 90
# 创建一个列表存放车辆轮廓中心点
cars = []
car_n = 0  # 车辆的个数
# 检测线的高   视频的尺寸为1280*720
line_height = 550
# 线的偏移
line_offset = 6
 
 
# 定义函数,计算中心点
def center(x, y, w, h):
    x1 = int(w / 2)
    y1 = int(h / 2)
    cx = x + x1
    cy = y + y1
    return cx, cy
 
 
while True:
    ret, frame = cap.read()
    if ret:
        # 灰度化
        cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 由于一些树叶也会动,形成噪点,所以进行去噪
        blur = cv2.GaussianBlur(frame, (9, 9), 5)  # 9*9可以自己设置 3*3  5*5 7*7.。。
        mask = bgsubmog.apply(blur)  # 去除背景
        # 腐蚀
        erode = cv2.erode(mask, k)
        # 腐蚀之后变小了,要膨胀
        dilate = cv2.dilate(erode, k, iterations=2)
        # 闭操作,去掉物体内部的小块
        close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, k)
        close = cv2.morphologyEx(close, cv2.MORPH_CLOSE, k)
        # 查找轮廓
        contours, h = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        # 每一帧都要画线
        cv2.line(frame, (0, line_height), (1280, line_height), (0, 255, 0), 2)
        for (i, c) in enumerate(contours):  # 拿到索引和边界
            (x, y, w, h) = cv2.boundingRect(c)  # 绘制矩形
            if w >= min_w and h >= min_h:  # 如果是车辆,绘制轮廓
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255))
                # 存取车的轮廓的中心点,如果中心点过线,代表有车经过
                cpoint = center(x, y, w, h)  # 计算中心点
                cars.append(cpoint)
                for (x, y) in cars:
                    # 如果车在线的上下偏移量之间,表示有车辆经过
                    if (y > line_height - line_offset) and (y < line_height + line_offset):
                        car_n += 1  # 车的数量+1
                        cars.remove((x, y))
                        print(car_n)
            else:  # 如果不是车辆,跳过
                continue
        # 显示车辆的统计信息
        cv2.putText(frame, 'Cars Count:' + str(car_n), (500, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 0), 5)
 
        cv2.imshow('video', frame)
    key = cv2.waitKey(33)
    if key == 113:  # 按‘q'退出
        break
 
cap.release()
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述

3.代码功能

这段代码涉及相当多的知识,下面来解释这段代码的具体功能:

1)首先,在导入模块后声明了训练图像的基础路径。定义这样的路径很有用,因为不同计算机上训练数据所在的文件夹不一样,这样做就可避免在每个地方都要修改这个路径。

在这里插入图片描述

2)去除背景

在这里插入图片描述

3)形态处理
去除背景后通过腐蚀去掉小的噪点。

在这里插入图片描述

4)查找轮廓
根据上面处理完的视频,可以找到一些(车和噪点的)轮廓 ,并且在原视频绘制出来,可以看到还是有一些其他的轮廓会显示出来。

在这里插入图片描述
5)车辆统计
查找到有效车辆后,需要将统计的个数显示在屏幕上。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Spring MVC》 第四章 域对象、视图、转发和重定向

前言 介绍Spring MVC的域对象、视图、转发和重定向 1、域对象共享数据 Spring MVC 提供了多种域对象共享数据的方式&#xff0c;其中最常用的方式如下&#xff1a; 1.1、使用 Servlet API 向 request 域对象中共享数据 服务端代码&#xff1a; RequestMapping("toLo…

为什么企业都需要搭建搭建一个内部知识库?

企业内部知识管理是指企业通过各种手段收集、整理、管理和传播企业内部的知识&#xff0c;以提高企业的竞争力和创新能力。在实践中&#xff0c;企业内部知识管理往往需要建立一个内部知识库&#xff0c;以更好地实现知识的共享和管理。本文将从以下几个方面探讨为什么企业内部…

【SWAT水文模型】ArcSWAT输入准备

ArcSWAT输入准备 1 必需的ArcSWAT空间数据集1.1 数字高程模型&#xff08;DEM&#xff09;1.2 土地覆盖/土地利用类型1.3 土壤数据 2 可选的ArcSWAT空间数据集2.1 DEM Mask2.2 Streams2.3 User- Defined Watersheds 3 ArcSWAT表格和文本文件3.1 子流域出口位置表(dBase 表)3.2 …

掏空腰包,日子难过,机缘转岗软件测试,这100个日夜的心酸只有自己知道...

我今年27岁&#xff0c;原本从事着土木工程相关的工作&#xff0c;19年开始有了转行的想法... 大学刚毕业那年&#xff0c;我由于学的是土木工程专业&#xff0c;自然而然的从事了和土木工程相关的工作&#xff0c;房贷、车贷&#xff0c;在经济的高压下&#xff0c;当代社会许…

Idea 配置 maven 离线使用

首先&#xff0c;项目中的依赖已经下载到本地仓库&#xff0c;在没有网络或者没办法连通公司的maven仓库时&#xff0c;需要配置离线使用。 1. 配置 setting.xml 在 maven 使用的 setting.xml 文件中&#xff0c;加入以下配置。 默认在 maven安装目录下的 conf 文件夹下 。 &…

没看错!一行python代码就可以帮您获取图片中的文字信息

最近工作中有需求需要用python对图片中的文字进行识别&#xff0c;调研了一下&#xff0c;选择了tesseract&#xff0c; 目前在github上有50.5k个star&#xff01;python可以调用&#xff0c;安装也十分方便&#xff0c;pip install pytesseract 即可。如果没有Pillow 包&…

关于yolov8的一些理解

文章目录 1.前言2.创新点及工作3. 网络结构3.1 BackBone3.1.1 C2F3.1.2 结构微调3.1.2 SPPF 3.2 Neck3.3 Head 4.正样本匹配策略4.1 静态分配策略&动态分配策略4.2 TaskAlignedAssigner 5.损失函数5.1 概述5.2 Distribution Focal Loss 6.总结 1.前言 YOLOv8 是 ultralyti…

vCener 配置 vSan 网络

文章目录 1. 准备2. 创建vsan网络2.1 创建 vSphere Distributed Switch &#xff08;vds&#xff09;2.2 添加管理主机2.3 添加 networking 3. 删除3.1 删除 vmkernel adapter3.2 删除 hosts3.3 删除 DSwitch 1. 准备 三台物理机搭建 exsi一台部署 vcenter 管理三台 exsi每台物…

如何计算连续变量的熵

背景 做特征选择时&#xff0c;有时候会用到计算特征的信息熵&#xff0c;可是离散的好计算&#xff0c;但连续的呢&#xff1f;按照把连续变量离散的方法设置阈值点吗&#xff1f;好像比较麻烦&#xff0c;需要排序&#xff0c; 计算阈值。没有能自动的方法吗&#xff1f; 找…

Linux入门 - 最常用基础指令汇总

目录 ls指令 pwd指令 cd指令 touch指令 mkdir指令 rmdir指令 && rm 指令 man指令&#xff08;重要&#xff09; cp指令&#xff08;重要&#xff09; mv指令&#xff08;重要&#xff09; cat指令 more指令 less指令&#xff08;重要&#xff09; head指令…

3.4 迭代法

4.1 雅克比迭代法&#xff1a; 雅可比迭代法是一种用于求解线性方程组的迭代算法&#xff0c;其基本思想是将线性方程组中的系数矩阵拆分为对角线矩阵和非对角线矩阵两部分&#xff0c;并利用对角线矩阵的逆矩阵来迭代求解方程组。 具体地&#xff0c;设线性方程组为Axb&…

4月17号软件资讯更新合集.....

CrateDB 5.3.0 发布&#xff0c;分布式 SQL 数据库 CrateDB 是一个分布式的 SQL 数据库&#xff0c;使得实时存储和分析大量的机器数据变得简单。CrateDB 提供了通常与 NoSQL 数据库相关的可扩展性和灵活性&#xff0c;最小的 CrateDB 集群可以轻松地每秒摄取数万条记录。这些…

L2-2 天梯赛的赛场安排

作者 陈越 单位 浙江大学 天梯赛使用 OMS 监考系统&#xff0c;需要将参赛队员安排到系统中的虚拟赛场里&#xff0c;并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们&#xff0c;以便发放比赛账号。为了尽可能减少教练和监考的沟通负担&#…

持续集成——接口测试集成实战

文章目录 一、接口测试持续集成的好处二、环境准备三、Jenkins节点挂载1、新建node节点2、编辑节点信息 四、节点环境的配置1、Python3环境2、allure-commandline工具3、allure插件 五、本地运行待测代码1、Pycharm拉取代码执行2、命令行运行代码&#xff0c;并生成报告 六、库…

太阳能电池测试解决方案NS-9001

前言 太阳能行业的快速发展提高了对太阳能电池测试和精确测量解决方案要求&#xff0c;伴随着太阳能电池尺寸大小质量的提升&#xff0c;充电电池测试必须更多的电流和更高输出功率水准&#xff0c;这就更加需要灵活多变的测试方案支持。 现阶段&#xff0c;太阳能电池测试 解…

可以一学的代码优化小技巧:减少if-else冗余

前言 if-else 语句对于程序员来说&#xff0c;是非常非常熟悉的一个判断语句&#xff0c;我们在日常开发和学习中都经常看见它&#xff0c;if-else语句主要用于需要做出选择的地方进行判断&#xff0c;这里就不再赘述if-else语法和特点了。 ​ 我们在写代码&#xff08;如图下…

Vue3通透教程【十】跨级组件通讯—依赖注入

文章目录 &#x1f31f; 写在前面&#x1f31f; provide函数&#x1f31f; inject 函数&#x1f31f; 跨组件通讯&#x1f31f; 写在最后 &#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的…

震惊!为了4680锂电池溯源,竟然做出这种事情

电池溯源&#xff0c;一直都是国家尤为重视的话题。 中国电子技术标准化研究院更是一再强调了&#xff1a;锂电编码标准编制和溯源平台初步建设方案。参会代表围绕锂电编码溯源体系建设有关问题开展了研讨&#xff0c;表示依托行业通用编码标准&#xff0c;建立完善的锂电全生…

C++面向对象丨1. 内存分区模型

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…