我正在做一个小汽车计数项目,但是我有一些问题,我能够计数,但并不是我想要的全部,我只计数了14辆24辆汽车,请帮助我不知道为什么我的代码有效50% 。 非常感谢。 我尝试更改过滤器选项以增加成功百分比,但是我没有得到更好的结果。
这是我的代码,正在运行:
import datetime
import cv2
import numpy as np
#Counting function
def conteo(y, ent):
if (ent-y<10 and y<ent):
return 1
else:
return 0
print('Version de OpenCV --> ', cv2.__version__)
print('Software desarrollado por - Luis Salgado Manzano - Open Source -')
# Parametros, rutas y varaibles
video_src = '../TFG-Vehicles/VideosFijos/video3.mp4'
width = 480
height = 480
area = width*height
area2 = area/2
font = cv2.FONT_HERSHEY_SIMPLEX
cap = cv2.VideoCapture(video_src)
contadorCoches= 0
# Algoritmo de Background Subtractor
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
frameBck = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
kernalOp = np.ones((3,3),np.uint8)
while True:
ret, frame1 = cap.read()
if (type(frame1) == type(None)):
break
#Ajustamos el tamaño del marco y el desenfoque
frame1 = cv2.resize(frame1, ( 480,480 ))
gray= cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY, cv2.CV_8UC1)
resize =cv2.GaussianBlur(gray,(11,11),0)
closing = cv2.morphologyEx(resize, cv2.MORPH_CLOSE, kernel)
# Remove noise
opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel)
# Dilate to merge adjacent blobs
dilation = cv2.dilate(opening, kernel, iterations = 2)
fgMask = frameBck.apply(resize, None)
ret, contornosimg =
cv2.threshold(fgMask,25,410,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
mask=cv2.morphologyEx(contornosimg,cv2.MORPH_OPEN,kernalOp)
# Buscamos contorno en la imagen
im, contornos, hierarchy = cv2.findContours(contornosimg, cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
# Recorremos todos los contornos encontrados
for c in contornos:
# Eliminamos los contornos más pequeños
if cv2.contourArea(c) <= 1900:
continue
#Calculamos el area para encontrar el centro del objeto.
if area>area2:
m=cv2.moments(c)
#Esto simplemente ignora los contornos que no están segmentados correctamente.
cx=int(m['m10']/m['m00'])
cy=int(m['m01']/m['m00'])
# Obtenemos el bounds del contorno, el rectángulo mayor que engloba al contorno
(x, y, w, h) = cv2.boundingRect(c)
# Dibujamos el rectángulo del bounds
cv2.circle(frame1,(cx,cy),2,(0,0,255),5)
cv2.rectangle(frame1, (x, y), (x + w, y + h), (0, 255, 0), 1)
vehiculos2 = 'Vehiculos totales: '+str(contadorCoches)
if (conteo(cy,450)):
contadorCoches += 1
print(contadorCoches)
cv2.line(frame1,(0,450),(640,450),(0,255,0),10)
cv2.putText(frame1, "Vehiculos: "+format(str(contadorCoches)),
(10,332),cv2.FONT_HERSHEY_SIMPLEX,.5,(0,255,0))
cv2.putText(frame1, vehiculos2, (15, 20),font, 0.5, (0, 100, 255), 1, cv2.LINE_AA)
cv2.putText(frame1, datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"),
(10, frame1.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 100, 255), 1)
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.imshow('video', frame1)
if cv2.waitKey(1) & 0xff == ord('q'):
print('Cierre de la aplicación con éxito')
break
cap.release()
cv2.destroyAllWindows()