计算车辆BackgroundSubtration

时间:2018-12-01 19:07:22

标签: python python-3.x opencv

我正在做一个小汽车计数项目,但是我有一些问题,我能够计数,但并不是我想要的全部,我只计数了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()

0 个答案:

没有答案