案例-使用python实现基于opencv的车辆识别

article/2025/9/28 16:24:04

写在开头,接触opencv也有很长一段时间了,中间还接触了halcon。但都是基于C++实现,发现如果有什么idea,还是使用python可以快速实现。基于C++版本的后期会有更新。

首先,这个案例是一个老生常谈的问题-车辆识别。首先我们要理解,车辆识别所需要的opencv知识点都有什么?并不是说拿到项目就是一顿狂干,首先要做分析-需求分析,然后才是概要设计,详细设计等…

先不考虑使用QT实现界面,就仅仅以opencv为基准,包括:窗口的展示,图像/视频的加载;基本图形的绘制;车辆的识别。车辆的识别包括基本图像运算和处理,形态学基础,轮廓的查找,文字显示等其次考虑需要的功能:1、加载车辆视频;2、通过形态学识别车辆;3、对车辆进行统计;4、显示车辆统计信息。

  1. 导入视频:数据是基础,第一步先确保视频能够正常的使用代码实现播放,具体代码如下:
import cv2
import numpy as np
cap =  cv2.VideoCapture('./img/Video.wmv')
if cap is None:print("路径问题")
else:while True:#读取视频帧ret,frame = cap.read()if(ret == True):cv2.imshow('cap',frame)key = cv2.waitKey(10)if(key == 27):break
#释放缓存资源
cap.release()
#释放所有窗口
cv2.destroyAllWindows()

结果如下图:
在这里插入图片描述
2. 去除背景:以上图为例,可以分为前景和背景,公路和花坛这些对比起车辆来说是固定不变的,变得是来来往往的车辆。所以呢,公路和花坛可以认定为背景。来来往往的车辆可以认定为前景。我们需要去除背景,单独处理各种车辆才能准确识别车辆。这也是这一步骤的存在意义。
当然去除背景会有很多的噪点存在如图:
在这里插入图片描述

所以我们还需要进行图像灰度化和高斯去噪。经过测试发现,去除背景之前进行灰度化和高斯去噪效果会好很多。具体代码如下:
高斯数值需要自己根据自己视频尝试修改

import cv2
import numpy as np
cap =  cv2.VideoCapture('./img/Video.wmv')
#引入去背景函数
bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()if cap is None:print("路径问题")
else:while True:#读取视频帧ret,frame = cap.read()if(ret == True):gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#去除背景##高斯去噪blur = cv2.GaussianBlur(gray,(7,7),sigmaX=5)##使用函数去背景mask = bgsubmog.apply(blur)cv2.imshow('mask',mask)key = cv2.waitKey(10)if(key == 27):break
#释放缓存资源
cap.release()
#释放所有窗口
cv2.destroyAllWindows()
  1. 形态学处理,标识车辆
    首先使用腐蚀去除背景中较小的噪点,这样后期在进行识别时可以去除干扰,接着就是使用膨胀操作,放大车辆的像素信息,作为后是识别使用,再然后,使用闭运算操作填补车辆像素之间的空白像素,最后使用轮廓识别,获取轮廓点。根据轮廓点画出车辆的最大外接矩形。
import cv2
import numpy as np
cap =  cv2.VideoCapture('./img/Video.wmv')
#引入去背景函数
bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()if cap is None:print("路径问题")
else:while True:#读取视频帧ret,frame = cap.read()if(ret == True):gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#去除背景blur = cv2.GaussianBlur(gray,(7,7),sigmaX=5)mask = bgsubmog.apply(blur)#卷积核kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))#腐蚀操作-去除背景中较小的噪点erode = cv2.erode(mask,kernel,iterations=2)#膨胀操作:还原放大车辆dilate = cv2.dilate(erode,kernel,iterations=3)#闭运算-填补车辆像素空隙close1 = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel2)close2 = cv2.morphologyEx(close1,cv2.MORPH_CLOSE,kernel2)#发现轮廓cnts,hi = cv2.findContours(close2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#取出轮廓点绘图for (i,c) in enumerate(cnts):x,y,w,h = cv2.boundingRect(c)cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)cv2.imshow('frame',frame)#cv2.imshow('dilate',dilate)key = cv2.waitKey(10)if(key == 27):break
#释放缓存资源
cap.release()
#释放所有窗口
cv2.destroyAllWindows()

结果如图所示:
在这里插入图片描述
4. 车辆的统计
此步骤主要是优化上一步骤出现的车辆在运行过程中出现一辆车多个识别框。可能是车窗、车牌等。首先,我们设置一个最小宽度和高度的矩形作为判断依据,这边我设置的是100,大于100的可以作为真实的车辆,否则就是车牌或者车窗。接着,我们不能出现车辆就判断,因为车辆是运动的,所以需要一条检测线,在检测线上下做一个判断范围,只要各个有效车辆所代表的的矩形框进去这个区间,就代表有一辆车辆行驶过。既简单来说就是,线有一个范围,根据矩形中心点在进入这个范围就代表有车辆经过。

import cv2
import numpy as np
#判断是否是车辆的最小矩形
min_w = 100
min_h = 100
#检测线的高度
line_high = 300
#统计有效车的数组
cars = []
#线的偏移量
offset = 6
#统计数量
carno = 0
#计算中心点函数
def center(x,y,w,h):x1 = int(w/2)y1 = int(h/2)cx = x+x1cy = y+y1return cx,cycap =  cv2.VideoCapture('./img/Video.wmv')
#引入去背景函数
bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()if cap is None:print("路径问题")
else:while True:#读取视频帧ret,frame = cap.read()#print(frame.shape)if(ret == True):gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#去除背景blur = cv2.GaussianBlur(gray,(7,7),sigmaX=5)mask = bgsubmog.apply(blur)#卷积核kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT,(9,9))#腐蚀操作-去除背景中较小的噪点erode = cv2.erode(mask,kernel,iterations=2)#膨胀操作:还原放大车辆dilate = cv2.dilate(erode,kernel2,iterations=1)#闭运算-填补车辆像素空隙close1 = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel2)#close2 = cv2.morphologyEx(close1,cv2.MORPH_CLOSE,kernel2)#发现轮廓cnts,hi = cv2.findContours(close1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#检测线cv2.line(frame,(10,line_high),(1316,line_high),(255,255,8),3)#取出轮廓点绘图for (i,c) in enumerate(cnts):x,y,w,h = cv2.boundingRect(c)#对车辆的宽高进行判断,验证是否是有效的车辆isValid = (w>=min_w) & (h>=min_h)if(not isValid):continue#得到有效车辆信息cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)#计算有效车辆的中心点cpoint = center(x,y,w,h)cars.append(cpoint)for(x,y) in cars:if(y>line_high-offset & y<line_high+offset):carno +=1cars.remove((x,y))print(carno)cv2.imshow('frame',frame)#cv2.imshow('dilate',dilate)key = cv2.waitKey(10)if(key == 27):break
#释放缓存资源
cap.release()
#释放所有窗口
cv2.destroyAllWindows()

在这里插入图片描述
4. 文字显示
这个为最后一个步骤就是让得到的车辆信息,使用文字实时显示出来,使用代码如下

cv2.putText(frame,"Cars Count:"+str(carno),(500,50),cv2.FONT_HERSHEY_SIMPLEX,2,(0,255,0),2)

结果如图所示
在这里插入图片描述

综上,就是使用python实现基于opencv的车辆识别系统的操作。其中对opencv中形态学的使用较为重要。后期别的案例也是对此处内容重复使用。
**

如果觉得改文章写得不错,可以点个赞再走哦,转文请注明来源!!!!

**


http://chatgpt.dhexx.cn/article/jCkagBiD.shtml

相关文章

MySQL清空单表数据

一&#xff1a;问题背景 1. 问题描述 之前测试1千万数据插入MySQL数据库里面,分别使用单线程的方式和线程池的方式对比测试&#xff0c;查看效果,但是插入了1千万数据后,由于是测试数据,现在不能在新建一张表浪费存储空间,还是之前的表,要清空原来的数据.有哪些方式可用&#x…

mysql清空表数据_mysql数据库之如何清空表中数据

本篇文章主要讲述的是在数据库中使用清空命令&#xff0c;具有一定学习价值&#xff0c;有需要的朋友可以了解一下&#xff0c;希望能够对你有所帮助。 在做数据迁移&#xff0c;数据清洗或者写web项目时要将数据替换更新&#xff0c;那么有时要将表做清空处理 常用的清空数据表…

mysql删除表中所有数据_MySQL删除或清空表中数据的方法

原标题&#xff1a;MySQL删除或清空表中数据的方法 要想把MySQL中的数据删除或清空&#xff0c;可以通过两种方法来实现&#xff1a;DELETE语句和TRUNCATE TABLE语句。 DELETE语句可以将表中所有记录都删除&#xff0c;也可以指定WHERE子句&#xff0c;对要删除的记录进行选择;…

清空MySQL单库下所有表数据 || 删除MySQL单库下所有表

一、清空MySQL单库下所有表数据 -- 清空MySQL单库下所有表数据 SELECT CONCAT(truncate table ,TABLE_NAME,;) AS PLEASE_EXEC_ALL_SQL FROMinformation_schema.TABLES WHERETABLE_SCHEMA datagateway_std;如下图&#xff0c;然后复制所有查询结果&#xff0c;依次执行清表命…

Mysql如何清空数据库中所有的表数据

“db”是数据库名称 SELECT CONCAT(truncate table ,TABLE_NAME,;) AS a FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA db ; 全部复制出来运行即可 有外键约束的话&#xff0c;我们可以使用 SET FOREIGN_KEY_CHECKS0; 来禁用外键约束&#xff0c;执行完我们的语句之…

90个外国英文网站强力推荐!!!

2019独角兽企业重金招聘Python工程师标准>>> http://www.mtime.com/group/lazy/discussion/163374/ 转载于:https://my.oschina.net/crazyinsomnia/blog/2739

常用的英文文献网站

最常用的英文文献网站当然是&#xff1a;sci-hub。 除此之外&#xff0c;推荐几个比较常用的英文文献网站&#xff1a; Elsevier ScienceDirect 数据库试用&#xff1a; http://www.sciencedirect.com 科学引文索引数据库&#xff08;SCI&#xff09;学术资源&#xff1a; h…

十大实用网站推荐(1)

Iiconfont矢量图标库http://www.iconfont.cn/设计师必备网站&#xff0c;成千上万个矢量图标&#xff0c;真正的“图标库”&#xff1a; 稿定设计https://www.gaoding.com/有点懒&#xff1f;抠图太麻烦&#xff1f;做设计有点烦&#xff1f;来这个网站看看吧&#xff0c;懒人…

英语网站学习

一说到英语学习网站&#xff0c;脑子里肯定就是啥BBC&#xff0c;TED&#xff0c;华尔街日报啊&#xff0c;但如果你是英语小白&#xff0c;你一定看的懂吗&#xff1f;太多的专业词汇&#xff0c;看都看不懂&#xff0c;还怎么帮助你快速提升英语&#xff1f;英语网站是学习的…

强烈推荐这 15 个网站!

作者 | ithuangqing 来源 | 编码之外&#xff08;ID&#xff1a;ithuangqing&#xff09; 电子书&#xff1f;纸质书&#xff1f;我喜欢免费 不得不说&#xff0c;纸质书看起来是最有感觉的&#xff0c;可是纸质书也有非常不好的两点&#xff1a; 搬家的时候真的头大贵&#x…

常用的15个国外网站

1.Random-Image-Api 地址&#xff1a;https://source.unsplash.com/ Random-Image-Api 一个能够获取随机图片的 Api&#xff0c;基于 Spring Boot 构建可读取本地图片列表的地址&#xff0c;并提供随机访问服务&#xff0c;可配置域名白名单访问。 2. Carbon 地址&#xff1…

国外有什么好的网站推荐?

先来一张用百度脑图做的“国外优秀网站”思维导图&#xff0c;让你一目了然。 / 一&#xff0c;知识类 1、维基百科-自由的百科全书&#xff1a;点击打开链接 2、Coursera-致力于普及全世界最好的教育:点击打开链接 3、IMDB- 互联网电影资料库:点击打开链接http://www. …

国外常用网站

作者&#xff1a;Allen9527 链接&#xff1a;https://www.zhihu.com/question/20247711/answer/113476501 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 放眼看世界&#xff0c;才能看得更远 &#xff08;持续更…

浅谈什么是嵌入式以及嵌入式就业前景

近期&#xff0c;很多问我什么是嵌入式&#xff1f;其实关于这个问题真的不好实际性的形容表达&#xff0c;毕竟不是一个实物和东西&#xff0c;让你看到见摸的着&#xff0c;但是它确实存在你的生活中&#xff0c;工作中。今天粤嵌就来浅谈一下&#xff0c;什么是嵌入式以及嵌…

嵌入式软件开发工程师就业发展前景怎么样?

嵌入式技术虽然不是新兴的技术&#xff0c;但是随着科学的不断发展&#xff0c;嵌入式能应用的领域也越来越多&#xff0c;例如人工智能、互联网等&#xff0c;这么说起来嵌入式开发工程师的就业前景应该会很不错&#xff0c;下面小编就具体的为大家介绍关于嵌入式软件开发和硬…

嵌入式人才发展前景

嵌入式计算机在应用数量上远远超过了各种通用计算机&#xff0c;一台通用计算机的外部设备中就包含了5-10个嵌入式微处理器。嵌入式发展前景怎样呢?嵌入式系统在制造工业、过程控制、网络、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品等方面均是嵌入式计…

软考中的嵌入式系统设计师为什么考的人少?

因为嵌入式系统设计师这个科目会比较难&#xff0c;一般大家都会选择软件设计师、系统集成项目工程师和网络工程师。嵌入式系统设计师属于计算机应用技术方向&#xff0c;考试的知识范围比较广&#xff0c;包含软硬件知 识&#xff0c;软件方面相对来说要容易些&#xff0c;但是…

做嵌入式开发,前景怎么样?

嵌入式一直冠以高门槛的名号&#xff0c;学习起来确实有些费劲&#xff0c;但热情投入嵌入式的人比比皆是。从长远来看&#xff0c;嵌入式开发渗透电子&#xff0c;安防、医疗、汽车、电信等各个行业&#xff0c;每年也有约四五十万的人才缺口&#xff0c;特别是近几年人工智能…

嵌入式还有发展前景吗?谁说嵌入式前景不如互联网!

在大多数人的观念里&#xff0c;一个行业有没有前途大概就是看工资高不高。 但是你见过谁靠工资发财了的&#xff1f; 很多人喜欢拿嵌入式和互联网比、和金融比。 跨行业之间其实是没可比性的&#xff0c;毕竟门槛和知识面深度是不一样的。 我从事了单片机行业近10年&#…

java就业前景_2020年java就业前景

java作为一门计算机言语&#xff0c;现已和咱们生活息息相关。Java的使用可以说是无处不在&#xff0c;从桌面作业使用到网络数据库等使用&#xff0c;从PC到嵌入式移动渠道&#xff0c;从Java小使用程序(Applet)到架构巨大的J2EE企业级解决方案&#xff0c;处处都有Java的身影…