Skip to content

Project ini berisi tentang penelitian saya menghitung jumlah kendaraan yang lewat di Jl Ahmad Yani Surabaya

Notifications You must be signed in to change notification settings

fajarwkwk/Python-OpenCv

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 

Repository files navigation

import numpy as np import cv2 import Car import time

Input and output counters

cnt_up = 0 cnt_down = 0

#Video source #cap = cv2.VideoCapture(0) cap = cv2.VideoCapture('4802.mp4')

#Properties of the video ##cap.set(3,160) #Width ##cap.set(4,120) #Height

#Print the capture properties to console for i in range(19): print (i, cap.get(i)) w = cap.get(3) h = cap.get(4) frameArea = h*w areaTH = frameArea/750 print ('Area Threshold', areaTH)

#In / out lines line_up = int(2*(h/5)) line_down = int(3*(h/5))

up_limit = int(1*(h/5)) down_limit = int(4*(h/5))

print ("Red line y:",str(line_down)) print ("Blue line y:", str(line_up)) line_down_color = (255,0,0) line_up_color = (0,0,255) pt1 = [0, line_down]; pt2 = [w, line_down]; pts_L1 = np.array([pt1,pt2], np.int32) pts_L1 = pts_L1.reshape((-1,1,2)) pt3 = [0, line_up]; pt4 = [w, line_up]; pts_L2 = np.array([pt3,pt4], np.int32) pts_L2 = pts_L2.reshape((-1,1,2))

pt5 = [0, up_limit]; pt6 = [w, up_limit]; pts_L3 = np.array([pt5,pt6], np.int32) pts_L3 = pts_L3.reshape((-1,1,2)) pt7 = [0, down_limit]; pt8 = [w, down_limit]; pts_L4 = np.array([pt7,pt8], np.int32) pts_L4 = pts_L4.reshape((-1,1,2))

#Background Substractor fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)

Structuring elements for morphographic filters

kernelOp = np.ones((3,3),np.uint8) kernelOp2 = np.ones((5,5),np.uint8) kernelCl = np.ones((11,11),np.uint8)

#Variables font = cv2.FONT_HERSHEY_SIMPLEX cars = [] max_p_age = 5 pid = 1

while(cap.isOpened()): ##for image in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): #Read an image of the video source ret, frame = cap.read()

frame = image.array

for i in cars:
    i.age_one() #age every object one frame

#Application background subtraction
fgmask = fgbg.apply(frame)
fgmask2 = fgbg.apply(frame)

#Binariazcion to eliminate shadows (gray color)
try:
    ret,imBin= cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY)
    ret,imBin2 = cv2.threshold(fgmask2,200,255,cv2.THRESH_BINARY)
    #Opening (erode->dilate) 
    mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN, kernelOp)
    mask2 = cv2.morphologyEx(imBin2, cv2.MORPH_OPEN, kernelOp)
    #Closing (dilate -> erode) 
    mask =  cv2.morphologyEx(mask , cv2.MORPH_CLOSE, kernelCl)
    mask2 = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, kernelCl)
except:
    print('EOF')
    print ('UP:',cnt_up)
    print ('DOWN:',cnt_down)
    break
# RETR_EXTERNAL returns only extreme outer flags. All child contours are left behind._, 
contours0, hierarchy = cv2.findContours(mask2,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours0:
    area = cv2.contourArea(cnt)
    if area > areaTH:
        #################
        #   TRACKING    #
        #################
        
        M = cv2.moments(cnt)
        cx = int(M['m10']/M['m00'])
        cy = int(M['m01']/M['m00'])
        x,y,w,h = cv2.boundingRect(cnt)

        new = True
        if cy in range(up_limit,down_limit):
            for i in cars:
                if abs(cx-i.getX()) <= w and abs(cy-i.getY()) <= h:
                    # the object is close to one that was already detected before
                    new = False
                    i.updateCoords(cx,cy)   #Update coordinates on the object and resets age
                    if i.going_UP(line_down,line_up) == True:
                        cnt_up += 1;
                        print ("ID:",i.getId(),'crossed going up at',time.strftime("%c"))
                    elif i.going_DOWN(line_down,line_up) == True:
                        cnt_down += 1;
                        print ("ID:",i.getId(),'crossed going down at',time.strftime("%c"))
                    break
                if i.getState() == '1':
                    if i.getDir() == 'down' and i.getY() > down_limit:
                        i.setDone()
                    elif i.getDir() == 'up' and i.getY() < up_limit:
                        i.setDone()
                if i.timedOut():
                    index = cars.index(i)
                    cars.pop(index)
                    del i     
            if new == True:
                p = Car.MyCar(pid,cx,cy, max_p_age)
                cars.append(p)
                pid += 1     
        cv2.circle(frame,(cx,cy), 5, (0,0,255), -1)
        img = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)            
        #cv2.drawContours(frame, cnt, -1, (0,255,0), 3)
#END for cnt in contours0
for i in cars:

if len(i.getTracks()) >= 2:

pts = np.array(i.getTracks(), np.int32)

pts = pts.reshape((-1,1,2))

frame = cv2.polylines(frame,[pts],False,i.getRGB())

if i.getId() == 9:

print str(i.getX()), ',', str(i.getY())

    cv2.putText(frame, str(i.getId()),(i.getX(),i.getY()),font,0.3,i.getRGB(),1,cv2.LINE_AA)
    
#################
#   IMAGES      #
#################
str_up = 'UP: '+ str(cnt_up)
str_down = 'DOWN: '+ str(cnt_down)
frame = cv2.polylines(frame,[pts_L1],False,line_down_color,thickness=2)
frame = cv2.polylines(frame,[pts_L2],False,line_up_color,thickness=2)
frame = cv2.polylines(frame,[pts_L3],False,(255,255,255),thickness=1)
frame = cv2.polylines(frame,[pts_L4],False,(255,255,255),thickness=1)
cv2.putText(frame, str_up ,(10,40),font,0.5,(255,255,255),2,cv2.LINE_AA)
cv2.putText(frame, str_up ,(10,40),font,0.5,(0,0,255),1,cv2.LINE_AA)
cv2.putText(frame, str_down ,(10,90),font,0.5,(255,255,255),2,cv2.LINE_AA)
cv2.putText(frame, str_down ,(10,90),font,0.5,(255,0,0),1,cv2.LINE_AA)
cv2.imshow('Frame',frame)
#cv2.imshow('Mask',mask)    
#press ESC to exit
k = cv2.waitKey(30) & 0xff
if k == 27:
    break

#END while(cap.isOpened()) cap.release() cv2.destroyAllWindows()

About

Project ini berisi tentang penelitian saya menghitung jumlah kendaraan yang lewat di Jl Ahmad Yani Surabaya

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published