第一步
# 创建窗口
cv2.namedWindow("video", cv2.WINDOW_NORMAL)
cv2.resizeWindow("video", 960, 640)
# 打开视频摄像头
cap = cv2.VideoCapture("video.mp4")
第二步
# 去背景
background =cv2.bgsegm.createBackgroundSubtractorMOG
# 形态学 获取一个kernel
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
第三步
# 灰度处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 高斯滤波
gauss = cv2.GaussianBlur(gray, (5, 5), sigmaX=5)
# 去背景
black = background.apply(gauss)
# 腐蚀, 去掉图中小斑块
erode = cv2.erode(black, kernel)
# 膨胀, 还原放大
dilate = cv2.dilate(erode, kernel, iterations=3)
# 闭运算 先膨胀 后腐蚀 去除图像里面的胡椒噪音
close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)
第四步
# 查找轮廓
counts, h = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
效果图
全部代码
import cv2
import numpy as np
# 线高
line_high = 550
# 统计车辆
car_count = 0
# # 创建窗口
cv2.namedWindow("video", cv2.WINDOW_NORMAL)
cv2.resizeWindow("video", 960, 640)
# 打开视频摄像头
cap = cv2.VideoCapture("video.mp4")
# 去背景
background = cv2.bgsegm.createBackgroundSubtractorMOG()
# 形态学 kernel
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 判断摄像头是否打开
while cap.isOpened():
# 读取视频的每一帧 返回ret True
ret, frame = cap.read()
if ret is True:
# 灰度处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 高斯滤波
gauss = cv2.GaussianBlur(gray, (5, 5), sigmaX=5)
# 中值滤波
# medium = cv2.medianBlur(gauss, 5)
# 去背景
black = background.apply(gauss)
# 腐蚀, 去掉图中小斑块
erode = cv2.erode(black, kernel)
# 膨胀, 还原放大
dilate = cv2.dilate(erode, kernel, iterations=3)
# 开运算 先腐蚀 后膨胀 去除图像表面的胡椒噪音
# open = cv2.morphologyEx(black, cv2.MORPH_OPEN, kernel)
# 闭运算 先膨胀 后腐蚀 去除图像里面的胡椒噪音
close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)
# close = cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel)
# 查找轮廓
counts, h = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 画线
cv2.line(frame, (20, line_high), (1400, line_high), (0, 0, 255), 5, 16)
# 绘制轮廓
for (i, c) in enumerate(counts): # c == counts[]
x, y, w, h = cv2.boundingRect(c) # 提取最大矩形的四个参数
print(w, h)
if w > 90 and h > 87:
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2) # 画出矩形轮廓
center_y = y + int(h/2) # 求矩形中心点y
print(center_y)
if line_high - 7 < center_y < line_high + 7:
car_count += 1
cv2.putText(frame, "count"+str(car_count), (500, 380), cv2.FONT_HERSHEY_COMPLEX, 2, (255, 255, 0))
else:
continue
cv2.putText(frame, "count" + str(car_count), (500, 380), cv2.FONT_HERSHEY_COMPLEX, 2, (255, 255, 0))
cv2.imshow("video", frame)
key = cv2.waitKey(10)
if key & 0xff == ord("q"):
exit()
else:
exit()
cap.release()
cv2.destroyAllWindows()
视频效果链接参考【opencv车辆检测-哔哩哔哩】 https://b23.tv/xnIWFim