写在开头,接触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中形态学的使用较为重要。后期别的案例也是对此处内容重复使用。
**

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

**

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

  1. 案例-使用python实现基于opencv的形状识别

    该案例主要涉及到不同形状的图形.根据获得轮廓,计算边数.来判断属于什么形状,并将之输出在图片上.具体代码和结果如下: import cv2 from urllib3 import connection ...

  2. Python 毕业设计 - 基于 opencv 的人脸识别上课考勤系统,附源码

    一.简介 这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的. 项目使用Python实现,基于OpenCV框架进行人脸识别和摄像头硬件调用,同时也用OpenCV工具包处理图片.交互界 ...

  3. Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别

    一.案例概述 本案例需要一定的Python编程基础并掌握OpenCV基本使用. 时间仓促:初略编写文档 效果如下: 开发环境: 操作系统:Windows 10 开发工具:PyCharm 2019.2版 ...

  4. Python基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

  5. Python 基于 opencv 的车牌识别系统, 可以准确识别车牌号

    大家好,我是程序员徐师兄,6 年大厂程序员经验,点击关注我 简介 毕业设计基于Opencv的车牌识别系统 车牌搜索识别找出某个车牌号 对比识别车牌系统 车牌数据库认证系统 车牌图文搜索系统 车牌数据库 ...

  6. 基于OpenCV实现人脸识别--Python

    目录 前言 第一章 OpenCV介绍 第二章 功能描述 2.1 对已有的数据进行检测 2.2 陌生人检测并发出警告 2.3 保存陌生人的视频 2.4 输入图片进行检测 2.5 现场录用信息 第三章 功 ...

  7. 基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

  8. 基于OpenCV的车牌识别的设计与实现

    随着大数据和互联网技术的快速发展,利用人工智能技术实现车牌信息的自动识别推荐成为研究的热门话题.通过对基于OpenCV的车牌识别系统的网站功能需要进行讨论研究,这种跨平台计算机视觉和机器学习非常适用于 ...

  9. 树莓派 --- 基于OpenCV实现人脸识别

    目录 参考博客 调百度人脸识别的API也能达到目的,我这里是基于OpenCV进行人脸识别 OpenCV(Open source Computer Vision Library) 是一个开源的计算机视觉 ...

最新文章

  1. linux:关于Linux系统中 CPU Memory IO Network的性能监测
  2. java solar_java中的内部类总结
  3. Spark SQL玩起来
  4. 信息系统项目管理师题型及题数
  5. 优化案例(part4)--A novel consensus learning approach to incomplete multi-view clustering
  6. windows.h和winsock2.h包含顺序问题(转)
  7. php传中文给Java_完美解决PHP中文乱码(转) - - JavaEye技术网站
  8. 哪个相机可以拍gif动图_入门级微单相机哪家强?索尼微单A6400评测来了!
  9. setState如何知道该做什么?
  10. UE4 虚幻引擎,BluePrint蓝图接受输入
  11. 【笔记】分布式网络与分布式账本
  12. 【Excel2019(六):数据透视表】【创建数据透视表+更改数据透视表汇总方式+数据透视表中的组合+汇总多列数据+创建计算字段+生成多张工作表】
  13. opencv打开图片显示全灰色
  14. 斯坦福大学公开课 :机器学习课程笔记-[第1集] 机器学习的动机与应用
  15. MyBatis - 官方网址
  16. 【采样算法】拉丁超立方采样
  17. 手把手教你实现一个抽奖系统(Java版)
  18. 知客CRM,管理软件优质选择
  19. 【爬虫进阶】Js逆向——有道批量翻译文本
  20. 《庄子·内篇·养生主第三》

热门文章

  1. 2021年T电梯修理考试资料及T电梯修理作业考试题库
  2. linux 和android开发环境,如何在linux下配置AndroidStudio开发环境
  3. 判断给定的链表是否有环
  4. Unity基础 3.3 2D物理系统 :刚体
  5. 银河麒麟系统飞腾CPU安装redis和nginx
  6. 题解 POJ1723 【SOLDIERS】
  7. pytest自动化测试框架基础篇
  8. 【数据结构】单链表的增删查改(C语言实现)
  9. Win10如何设置桌面右键新建菜单添加记事本选项并进行选项的排序和删除
  10. ArrayObject的使用