#2
lwy2xxj2022-11-29 18:09
|
只有本站会员才能查看附件,请 登录
程序代码:
import cv2
import numpy as np
from skimage.morphology import remove_small_objects
#实验视频的存放地址
video_path = 'vvvv.mp4'
interval=5
times =0
rate1=0.0
rate2=0.0
min_w = 85
min_h = 85
#检测线的高度
line_high = 550
#线的偏移
offset = 7
#统计车的数量
carno =0
#存放有效车辆的数组
cars = []
# 确定中心点位置
def center(x, y, w, h):
x1 = int(w/2)
y1 = int(h/2)
cx = x + x1
cy = y + y1
return cx, cy
#设定显示窗口的大小和名字
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',1280,720)
cap = cv2.VideoCapture(video_path)
#背景差分
bgsegm = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
mog = cv2.bgsegm.createBackgroundSubtractorMOG()
#形态学kernel,卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
erode_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (4, 4))
dilate_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (6, 6))
while True:
ret, frame = cap.read()
white=0
squre=0
if(ret):
#灰度
gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#去噪(高斯)
blur = cv2.GaussianBlur(gray, (3,3), 5)
#去背影
mask = mog.apply(blur)
_, thresh = cv2.threshold(mask, 244, 255, cv2.THRESH_BINARY)
#腐蚀, 去掉图中小斑块
erode = cv2.erode(mask, erode_kernel,thresh)
#膨胀, 还原放大
dilate = cv2.dilate(erode, dilate_kernel, iterations = 2)
#闭操作,去掉物体内部的小块
close1 = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)
shape = close1.shape
#从二值图里查找轮廓
cnts, h = cv2.findContours(close1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#画一条检测线
cv2.line(frame, (70, line_high), (1210, line_high), (255, 188, 0), 3)
# times+=1
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(frame, (x, y), (x+w, y+h), (0,0,255), 2)
#之前定义的函数
cpoint = center(x, y, w, h)
cars.append(cpoint)
#定义数组
cv2.circle(frame, (cpoint), 5, (0,0,255), -1)
for (x, y) in cars: #x,y为红色中心点
if( (y > line_high - offset) and (y < line_high + offset ) ):
carno +=1
cars.remove((x , y ))
squre+=w*h
if(times%interval==0):
rate1=squre*1.0/(shape[0]*shape[1])
rate2=1.0-rate1
# 设置文本
cv2.putText(frame, "Vehicles Count:" + str(carno), (400, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,0,0), 5)
cv2.putText(frame,"White rate:" + str(('%.4f'%rate1)), (400, 120), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 0, 0), 4)
cv2.putText(frame,"Black rate:" + str(('%.4f'%rate2)), (400, 180), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 0, 0), 4)
cv2.imshow('video',frame)
if cv2.waitKey(1)&0xFF==27:
break
cap.release()
cv2.destroyAllWindows()
import numpy as np
from skimage.morphology import remove_small_objects
#实验视频的存放地址
video_path = 'vvvv.mp4'
interval=5
times =0
rate1=0.0
rate2=0.0
min_w = 85
min_h = 85
#检测线的高度
line_high = 550
#线的偏移
offset = 7
#统计车的数量
carno =0
#存放有效车辆的数组
cars = []
# 确定中心点位置
def center(x, y, w, h):
x1 = int(w/2)
y1 = int(h/2)
cx = x + x1
cy = y + y1
return cx, cy
#设定显示窗口的大小和名字
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',1280,720)
cap = cv2.VideoCapture(video_path)
#背景差分
bgsegm = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
mog = cv2.bgsegm.createBackgroundSubtractorMOG()
#形态学kernel,卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
erode_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (4, 4))
dilate_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (6, 6))
while True:
ret, frame = cap.read()
white=0
squre=0
if(ret):
#灰度
gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#去噪(高斯)
blur = cv2.GaussianBlur(gray, (3,3), 5)
#去背影
mask = mog.apply(blur)
_, thresh = cv2.threshold(mask, 244, 255, cv2.THRESH_BINARY)
#腐蚀, 去掉图中小斑块
erode = cv2.erode(mask, erode_kernel,thresh)
#膨胀, 还原放大
dilate = cv2.dilate(erode, dilate_kernel, iterations = 2)
#闭操作,去掉物体内部的小块
close1 = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)
shape = close1.shape
#从二值图里查找轮廓
cnts, h = cv2.findContours(close1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#画一条检测线
cv2.line(frame, (70, line_high), (1210, line_high), (255, 188, 0), 3)
# times+=1
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(frame, (x, y), (x+w, y+h), (0,0,255), 2)
#之前定义的函数
cpoint = center(x, y, w, h)
cars.append(cpoint)
#定义数组
cv2.circle(frame, (cpoint), 5, (0,0,255), -1)
for (x, y) in cars: #x,y为红色中心点
if( (y > line_high - offset) and (y < line_high + offset ) ):
carno +=1
cars.remove((x , y ))
squre+=w*h
if(times%interval==0):
rate1=squre*1.0/(shape[0]*shape[1])
rate2=1.0-rate1
# 设置文本
cv2.putText(frame, "Vehicles Count:" + str(carno), (400, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,0,0), 5)
cv2.putText(frame,"White rate:" + str(('%.4f'%rate1)), (400, 120), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 0, 0), 4)
cv2.putText(frame,"Black rate:" + str(('%.4f'%rate2)), (400, 180), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 0, 0), 4)
cv2.imshow('video',frame)
if cv2.waitKey(1)&0xFF==27:
break
cap.release()
cv2.destroyAllWindows()