欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > OpenCV--车辆数量统计/人流量统计实战

OpenCV--车辆数量统计/人流量统计实战

2025/2/23 19:54:59 来源:https://blog.csdn.net/GamBleout/article/details/142779293  浏览:    关键词:OpenCV--车辆数量统计/人流量统计实战

车辆数量统计

  • 笔记和代码

笔记和代码

import cv2
import numpy as np"""
车辆数量统计/人流量统计
"""# 加载视频
cap = cv2.VideoCapture(',/video.mp4')# 创建mog对象 预处理 去除背景:保证视频中能够精准捕捉车辆(前景)
mog = cv2.createBackgroundSubtractorMOG2()# 创建腐蚀核 矩形
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))# 设置外接矩形过滤阈值
min_w = 100
min_h = 90# 设置检测线,当车辆过这条线时再统计个数
line_high = 600
# 设置车辆数组,判断车辆是否在检测线值+-offset的范围内
cars = []
# 车辆个数
car = 0
# 设置偏移量 便于在检测线附近检测
offset = 6# 计算外接矩形的中心点坐标
def center(x, y, w, h):x1 = int(w / 2)y1 = int(h / 2)cx = int(x) + x1cy = int(y) + y1return cx, cy# 循环读取视频
while True:# 读取每一帧数据,返回标记和这一帧数据ret, frame = cap.read()# ret为True,表示读到了数据if ret:# 把原始帧进行灰度化,然后去噪gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 高斯去噪blur = cv2.GaussianBlur(gray, (3, 3), 5)# 去除背景frame_mask = mog.apply(blur)# 还是存在噪点 我们使用腐蚀和膨胀erode = cv2.erode(frame_mask, kernel)# 腐蚀可能让车辆也变小了,我们多膨胀几次dilate = cv2.dilate(erode, kernel, iterations=2)# 去除车辆内部的噪点(闭运算)close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)# 查找轮廓 轮廓记序号方法:cv2.RETR_TREE, 近似轮廓:cv2.CHAIN_APPROX_SIMPLEcontours, hierarchy = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 画出检测线,过这条线后再统计车辆个数cv2.line(frame, (10, line_high), (1200, line_high), (255, 255, 0), 3)# 画出所有检测出来的轮廓for contour in contours:# 最大外接矩形 矩形的起始坐标(x, y),矩形的长宽wh(x, y, w, h) = cv2.boundingRect(contour)# 根据外接矩形的wh大小过滤小矩形(非车辆的干扰因素)is_valid = (w >= min_w) and (h >= min_h)if not is_valid:continue# 如果符合条件,则画出来,要求坐标点都是整数cv2.rectangle(frame, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 2)# 把车抽象为一个点,即外接矩形的中心点,便于统计个数x_point, y_point = center(x, y, w, h)# 放入数组中 append放入的是列表,因为一次性可能有多个车过cars.append((x_point, y_point))# 把点画出来 -1表示实心点cv2.circle(frame, (x_point, y_point), 5, (0, 0, 255), -1)# 判断汽车是否过检测线for (x, y) in cars:if (line_high - offset) < y < (line_high + offset):# 统计落入了区间 车辆计数加一,已经检测过的车辆移除# 如果车辆统计不到位(有的车没有统计),可能是line_high和offset的值不合理car += 1cars.remove((x, y))# 显示车辆计数信息cv2.putText(frame, 'Vehicle Count:' + str(car), (500, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 5)cv2.imshow('video', close)# 1ms一帧key = cv2.waitKey(1)# 用户按esc退出if key == 27:break# 释放资源
cap.release()
cv2.destroyAllWindows()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com