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

【P81 10-7】OpenCV Python【实战项目】——车辆识别、车流统计(图像/视频加载、图像运算与处理、形态学、轮廓查找、车辆统计及显示)

P81 10-7

  • 1.项目总览
  • 2. 视频加载
  • 3. 去背景
  • 4.形态学处理,轮廓统计
  • 5.逻辑处理
  • 6 实时显示统计信息
    • 6.2 SyntaxError: positional argument follows keyword argument
  • 7 完整代码
  • 8 传统方法 存在的缺陷

1.项目总览

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 视频加载

import cv2
import numpy as npcap=cv2.VideoCapture('video.mp4')while True:ret,fram=cap.read()cv2.imshow('video',fram)key=cv2.waitKey(100)if(key==27):break
cap.release()
cv2.destroyAllWindows()

在这里插入图片描述

3. 去背景

opencv–背景减除–BackgroundSubtractorMOG2

createBackgroundSubtractorMOG();该函数可以使用默认参数,修改最多的是history,值越大计算越准,越耗时;
在这里插入图片描述
在这里插入图片描述

.apply() 就可以得到前景的掩模了

移动的物体会被标记为白色,背景会被标记为黑色的

前景的掩模就是白色的了

import cv2
import numpy as npcap=cv2.VideoCapture('video.mp4')#获取背景,此功能需要安装opencv扩展库
bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()while True:ret,fram=cap.read()if(ret==True):#灰度cv2.cvtColor(fram,cv2.COLOR_BGRA2GRAY)#去噪(高斯)blur=cv2.GaussianBlur(fram,(3,3),5)#去背景,.apply() 得到前景的掩模了,移动的物体会被标记为白色,背景会被标记为黑色的mask=bgsubmog.apply(blur)cv2.imshow('mask',mask)key=cv2.waitKey(100)if(key==27):break
cap.release()
cv2.destroyAllWindows()

在这里插入图片描述

高斯滤波去噪
在这里插入图片描述

4.形态学处理,轮廓统计

  • 腐蚀, 去掉图中小斑块
  • 膨胀, 还原放大
  • 闭操作, 去掉物体内部小块
import cv2
from cv2 import COLOR_BGRA2GRAY
from cv2 import erode
from cv2 import dilate
from cv2 import CHAIN_APPROX_SIMPLE
import numpy as npcap=cv2.VideoCapture('video.mp4')
#获取背景,此功能需要安装opencv扩展库
bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()#形态学kernel
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))while True:ret,fram=cap.read()if(ret==True):#灰度cv2.cvtColor(fram,cv2.COLOR_BGRA2GRAY)#去噪(高斯)blur=cv2.GaussianBlur(fram,(3,3),5)#去背景,.apply() 得到前景的掩模了,移动的物体会被标记为白色,背景会被标记为黑色的mask=bgsubmog.apply(blur)#腐蚀,去掉图中小斑块erode=cv2.erode(mask,kernel)#膨胀,还原放大dilate=cv2.dilate(erode,kernel,iterations=3)#闭操作,去掉物体内部小块close=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)close=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)cv2.imshow('mask',mask)cv2.imshow('erode',erode)cv2.imshow('dilate',dilate)cv2.imshow('close',close)key=cv2.waitKey(100)if(key==27):break
cap.release()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

 #轮廓查找contours,hierarchy=cv2.findContours(close,cv2.RETR_TREE,CHAIN_APPROX_SIMPLE)for (i,c) in enumerate(contours):(x,y,w,h)=cv2.boundingRect(c)print(x,x,w,h)cv2.rectangle(fram,(x,y),(x+w,y+h),(0,0,255),2)

在这里插入图片描述

5.逻辑处理

import cv2
import numpy as np#车辆的最小宽高
min_w=90
min_h=90#定义线高
line_high=550
#线的偏移量
offset=7#存放车辆数组
cars=[]
#统计车的数量
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('video.mp4')
#获取背景,此功能需要安装opencv扩展库
bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()#形态学kernel
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))while True:ret,fram=cap.read()if(ret==True):#灰度cv2.cvtColor(fram,cv2.COLOR_BGRA2GRAY)#去噪(高斯)blur=cv2.GaussianBlur(fram,(3,3),5)#去背景,.apply() 得到前景的掩模了,移动的物体会被标记为白色,背景会被标记为黑色的mask=bgsubmog.apply(blur)#腐蚀,去掉图中小斑块erode=cv2.erode(mask,kernel)#膨胀,还原放大dilate=cv2.dilate(erode,kernel,iterations=3)#闭操作,去掉物体内部小块close=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)close=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)#轮廓查找cnts,h=cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#划一条检测线cv2.line(fram,(10,line_high),(1200,line_high),(255,225,0),3)for (i,c) in enumerate(cnts):(x,y,w,h)=cv2.boundingRect(c)#对车辆宽高进行判断,验证是否有效的车辆isValid=(w>=min_w) and (h>=min_h)if(not isValid):continue#到这里的是有效的车cv2.rectangle(fram,(x,y),(x+w,y+h),(0,0,255),2)#计数方式,计算汽车轮廓中心点,当这个中心点经过指定的那条界限,数量加一cpoint =center(x,y,w,h)#print(cpoint)cars.append(cpoint)#要有一条线#偏移范围6,点在线的附近+-6处经过都有效#从数组中减去for (x, y) in cars:if((y > line_high - offset) and (y < line_high + offset)):carno +=1cars.remove((x,y))print(carno)cv2.imshow('video',fram)key=cv2.waitKey(1)if(key==27):breakcap.release()
cv2.destroyAllWindows()

在这里插入图片描述

6 实时显示统计信息

putText函数直接写在内循环,屏幕上打印的text会一闪而过

   for (x, y) in cars:if((y > line_high - offset) and (y < line_high + offset)):carno +=1cars.remove((x,y))print(carno)cv2.putText(fram,"Cars Contur:"+str(carno),(500,60),fontFace=FONT_HERSHEY_COMPLEX_SMALL,fontScale=2,color=(0,255,0),thickness=5)

6.2 SyntaxError: positional argument follows keyword argument

在这里插入图片描述

SyntaxError: positional argument follows keyword argument
出现这个bug的原因在于参数位置不正确,关键字参数必须跟随在位置参数后面! 因为python函数在解析参数时, 是按照顺序来的, 位置参数是必须先满足, 才能考虑其他可变参数.

解决方法1: 出错的位置起,每个变量前面都加上形参的名字

cv2.putText(fram,"Cars Contur:"+str(carno),(500,60),fontFace=FONT_HERSHEY_COMPLEX_SMALL,fontScale=2,color=(0,255,0),thickness=5)

解决方法2: 删掉所有形参的名字

cv2.putText(fram,"Cars Contur:"+str(carno),(500,60),FONT_HERSHEY_COMPLEX_SMALL,2,(0,255,0),5)

7 完整代码

import cv2
from cv2 import FONT_HERSHEY_COMPLEX_SMALL
import numpy as np#车辆的最小宽高
min_w=100
min_h=90#定义线高
line_high=550
#线的偏移量
offset=7#存放车辆数组
cars=[]
#统计车的数量
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('video.mp4')
#获取背景,此功能需要安装opencv扩展库
bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()#形态学kernel
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))while True:ret,fram=cap.read()if(ret==True):#灰度cv2.cvtColor(fram,cv2.COLOR_BGRA2GRAY)#去噪(高斯)blur=cv2.GaussianBlur(fram,(3,3),5)#去背景,.apply() 得到前景的掩模了,移动的物体会被标记为白色,背景会被标记为黑色的mask=bgsubmog.apply(blur)#腐蚀,去掉图中小斑块erode=cv2.erode(mask,kernel)#膨胀,还原放大dilate=cv2.dilate(erode,kernel,iterations=3)#闭操作,去掉物体内部小块close=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)close=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)#轮廓查找cnts,h=cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#划一条检测线cv2.line(fram,(10,line_high),(1200,line_high),(255,225,0),3)for (i,c) in enumerate(cnts):(x,y,w,h)=cv2.boundingRect(c)#对车辆宽高进行判断,验证是否有效的车辆isValid=(w>=min_w) and (h>=min_h)if(not isValid):continue#到这里的是有效的车cv2.rectangle(fram,(x,y),(x+w,y+h),(0,0,255),2)#计数方式,计算汽车轮廓中心点,当这个中心点经过指定的那条界限,数量加一cpoint =center(x,y,w,h)cv2.circle(fram,cpoint,5,(0,0,255),-1)#print(cpoint)cars.append(cpoint)#要有一条线#偏移范围6,点在线的附近+-6处经过都有效#从数组中减去for (x, y) in cars:if((y > line_high - offset) and (y < line_high + offset)):carno +=1cars.remove((x,y))print(carno)# cv2.putText(fram,"Cars Contur:"+str(carno),(500,60),fontFace=FONT_HERSHEY_COMPLEX_SMALL,fontScale=2,color=(0,255,0),thickness=5)cv2.putText(fram,"Cars Contur: "+str(carno),(500,60),FONT_HERSHEY_COMPLEX_SMALL,2,(255,0,0),3)cv2.imshow('video',fram)key=cv2.waitKey(50)if(key==27):breakcap.release()
cv2.destroyAllWindows()

在这里插入图片描述

8 传统方法 存在的缺陷

但是仍然存在一下问题,
1.检测线的高低;
2.检测物体的长宽设置;
3.检测线偏移量;
4.以检测框的中心经过检测线作为检测表标准,容易漏记多计;

以上提到的几个事项的参数,都是人为设定的,不够灵活。这是传统算法的缺点,深度学习可以跟踪,从车辆进入视线和离开视线跟踪为一辆车,不会重复,漏计等

http://www.xdnf.cn/news/17695.html

相关文章:

  • 网络协议序列化工具Protobuf
  • 4.1vue3的setup()
  • 2019 GPT2原文 Language Models are Unsupervised Multitask Learners - Reading Notes
  • Kotlin Data Classes 快速上手
  • Qt TCP 客户端对象生命周期与连接断开问题解析
  • 解锁Prompt秘籍:框架、技巧与指标全解析
  • Windows 11操作系统 Git命令执行速度慢
  • SpringMVC基本原理和配置
  • 第2节 如何计算神经网络的参数:AI入门核心逻辑详解
  • pytorch学习笔记-加载现有的网络模型(VGG16)、增加/修改其中的网络层(修改为10分类)
  • 云计算-多服务集群部署实战指南:从JumpServer到Kafka、ZooKeeper 集群部署实操流程
  • 70亿参数让机器人“开窍“:英伟达Cosmos Reason如何让AI理解物理世界
  • 分段锁和限流的间接实现
  • 基于51单片机的手机蓝牙控制8位LED灯亮灭设计
  • Day19 C 语言标准 IO 机制
  • 深度学习——03 神经网络(2)-损失函数
  • 2021 年全国硕士研究生招生考试真题笔记
  • AI时代程序员的进化:从代码工人到创意架构师-优雅草卓伊凡引言:AI浪潮下的职业重构
  • 若依前后端分离版学习笔记(九)——登录和操作日志
  • OpenBMC中的BMCWeb:架构、原理与应用全解析
  • C#面试题及详细答案120道(11-20)-- 面向对象编程(OOP)
  • 初识c语言————排序方法
  • 闹钟时间到震动与声响提醒的实现-库函数版(STC8)
  • springboot接口请求参数校验
  • 力扣121:买卖股票的最佳时机
  • I2c、SPI、USB驱动架构类比
  • 管理变量和事实
  • 【Unity3D】Spine黑线(预乘问题)、贴图边缘裁剪问题
  • @系统管理 - Ansible 补丁管理方案(Windows Linux)
  • 飞算JavaAI的“盾牌”计划:手撕Spring Security + JWT认证链