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

【实战】OpenCV 视频车辆统计

项目总体分为四大步:

  1. 加载视频
  2. 车辆识别
  3. 车辆统计
  4. 信息显示

1. 加载视频

import cv2
import numpy as np# 读取视频
cap = cv2.VideoCapture('video/cars.mp4')while True:# 读取帧ret, frame = cap.read()if (ret == True):cv2.imshow('video', frame)else:breakkey = cv2.waitKey(1)if (key == 27):breakcap.release()cv2.destroyAllWindows()

2. 车辆识别

形态学处理

import cv2
import numpy as np# 读取视频
cap = cv2.VideoCapture('video/cars.mp4')bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()# 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))while True:# 读取帧ret, frame = cap.read()if (ret == True):# 灰度cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 去噪blur = cv2.GaussianBlur(frame, (3, 3), 5)# 去背影mask =  bgsubmog.apply(blur)# 腐蚀 去掉小方块erode = cv2.erode(mask, kernel)# 膨胀 还原放大dilate = cv2.dilate(erode, kernel, iterations=3)# 闭操作 去掉物体内部方块close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)# cnts, h = cv2.findContours(close, 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), (0, 0, 255), 2)cv2.imshow('video', mask)cv2.imshow('erode', close)else:print("Error")breakkey = cv2.waitKey(1)if (key == 27):breakcap.release()cv2.destroyAllWindows()     

3. 车辆统计

最小合法车宽高和检测线高度根据实际情况需要调整。

import cv2
import numpy as np# 最小合法车宽高
min_w = 50
min_h = 60# 检测线高度
line_high = 600# 存放有效车辆数组
cars = []# 线的偏移量
offset = 6# 统计车的数量
carno = 0def center(x, y, w, h):x1  =int(w/2)y1 = int(h/2)cx = x + x1cy = y + y1return cx, cy# 读取视频
cap = cv2.VideoCapture('video/cars.mp4')bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()# 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))while True:# 读取帧ret, frame = cap.read()if (ret == True):# 灰度cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 去噪blur = cv2.GaussianBlur(frame, (3, 3), 5)# 去背影mask =  bgsubmog.apply(blur)# 腐蚀 去掉小方块erode = cv2.erode(mask, kernel)# 膨胀 还原放大dilate = cv2.dilate(erode, kernel, iterations=3)# 闭操作 去掉物体内部方块close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)# cnts, h = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 绘制检测线cv2.line(frame, (10, line_high), (1200, line_high), (255, 255, 0), 3)for (i, c)  in enumerate(cnts):(x, y, w, h) = cv2.boundingRect(c)cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)# 对车辆的宽高进行判断# 以验证是否是有效车辆isValid = (w >= min_w) and (h >= min_h)if (not isValid):continue# 到这里都是有效车cpoint = center(x, y, w, h)cars.append(cpoint)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', frame)else:print("Error")breakkey = cv2.waitKey(1)if (key == 27):breakcap.release()cv2.destroyAllWindows()     

4. 显示信息(完整代码)

这部分我根据视频的实际情况,对形态学操作做了一些调整。
但识别效果仍然不是太好,还需要进一步调整。
image

import cv2
import numpy as np# 最小合法车宽高
min_w = 50
min_h = 60# 检测线高度
line_high = 600# 存放有效车辆数组
cars = []# 线的偏移量
offset = 6   # 统计车的数量
carno = 0def center(x, y, w, h):x1  =int(w/2)y1 = int(h/2)cx = x + x1cy = y + y1return cx, cy# 读取视频
cap = cv2.VideoCapture('video/cars.mp4')bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()# 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))while True:# 读取帧ret, frame = cap.read()if (ret == True):# 灰度cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 去噪blur = cv2.GaussianBlur(frame, (5, 5), 5)# 去背影mask =  bgsubmog.apply(blur)# 膨胀 还原放大dilate = cv2.dilate(mask , kernel, iterations=5)# 腐蚀 去掉小方块erode = cv2.erode(dilate, kernel, iterations=3)# 闭操作 去掉物体内部方块close = cv2.morphologyEx(erode, cv2.MORPH_CLOSE, kernel, iterations=6)# cnts, h = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 绘制检测线cv2.line(frame, (10, line_high), (1200, line_high), (255, 255, 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# 到这里都是有效车cpoint = center(x, y, w, h)cars.append(cpoint)cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)for (x, y) in cars:if ((y > line_high - offset) and (y < line_high + offset)):carno += 1cars.remove((x, y))print(carno)cv2.putText(frame, "Cars Count:" + str(carno), (500, 60), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 2, (255, 0, 0), 5)cv2.imshow('video', frame)cv2.imshow('1', close)else:print("Error")breakkey = cv2.waitKey(1)if (key == 27):breakcap.release()cv2.destroyAllWindows()     
http://www.hskmm.com/?act=detail&tid=27330

相关文章:

  • 2025 人力资源管理系统公司最新推荐榜单:AI 驱动下的全场景解决方案与品牌实力深度解析
  • P11988 [JOIST 2025] 宇宙怪盗 题解
  • 2025 年石墨烯厂家最新推荐榜单:氧化 / 羧基化 / 巯基化 / 羟基化 / 氨基化 / 氮掺杂石墨烯优质厂商全面解析与选购指南
  • 2025铝合金牺牲阳极厂家推荐榜:牺牲阳极阴极保护工业防腐技术
  • 2025 年压滤机厂家最新推荐排行榜:隔膜 / 污泥 / 真空 / 板框 / 带式压滤机厂家权威甄选指南板框/带式/污泥脱水/气化渣脱水专用/污泥专用脱水压滤机厂家推荐
  • 2025 年最新推荐!点胶机源头厂家权威排行榜:涵盖自动 / 果冻胶 / 无痕内衣 / 烫钻等多类型设备,助企业精准选品
  • 2025 年制袋机厂家推荐,广州速益科技提供多品类自动化设备与专业售后服务
  • 2025 年最新推荐云手机服务平台权威榜单:商用办公 / 多开设备 / 托管定制 / 租赁等场景优质品牌全解析
  • Octane 2022 汉化版适配C4D 2021-2023实用指南
  • 通俗易懂:什么是PostgreSQL中级认证(PGCP认证)
  • SQL Server 限制IP访问数据库的设置方法及注意事项
  • 2025 升降桌源头厂家最新推荐榜:聚焦国产新锐与实力大厂,解锁高性价比选购指南升降桌框/升降办公桌/升降办公桌框厂家推荐
  • 产品经理必看:原型设计工具三大能力解析(交互/AI/素材库)
  • AI 智能体 RAG 入门教程
  • 基于 RS 锁存器的真随机数生成器
  • 实用指南:会议安排问题之贪心算法
  • 10 9
  • 2025 年高压反应釜厂家最新推荐排行榜:涵盖多材质多类型设备,精选实力厂家助企业精准选购高温/加氢/不锈钢/实验室/钛材/镍材高压反应釜厂家推荐
  • CF1083D The Fair Nuts getting crazy(线段树/单调栈)
  • 2025 年最新水环真空泵生产厂家排行榜:优质品牌最新推荐,助企业精准选购适配设备罗茨水环真空泵组/山东水环真空泵/水环真空泵负压站/水环真空泵机组厂家推荐
  • QLabel加入点击的几种方式
  • 2025 年看守所会见律师联系方式推荐,徐义明律师专业刑事辩护与高效会见服务
  • 软件技术基础第一次作业1
  • 昇腾个人学习笔记
  • iOS 26 性能测试全攻略,从界面体验到性能指标
  • 市场宽度实时定时版
  • 2025 年光伏展会预定,上海伏勒密科技有限公司打造覆盖全产业链的国际化新能源会展服务平台
  • ant-design-vue 4.x版本在谷歌浏览器80版本中样式不显示的问题
  • 实验结论
  • 2025 年喷雾干燥机厂家最新推荐:国内实力企业排行榜,含离心式 / 压力式 / 实验型设备品牌深度解析