Object Counter

Gifa Delyani Nursyafitri
10 min readJan 4, 2020

--

Holaaa, people!

Balik lagi bareng aku. Kali ini kita bakalan bahas tentang Object Counter. Nah kira kira ngapain sih?

Penasaran kan. Check it out!

Kali ini kita akan menghitung jumlah object di dalam video, dimana object nya adalah mobil.

Langkah pertama adalah mencari video, kali ini kita akan menggunakan video M6 Motorway Traffic.mp4 yang ada di youtube. Kalian bebas memilih video apa saja, yang penting ada objeknya hehe.

Kemudian kita akan memasukkan video yang telah kita download. Untuk melakukan hal tersebut maka dapat menggunakan syntax berikut,

import numpy as np
import cv2cap = cv2.VideoCapture('M6 Motorway Traffic.mp4')
while(cap.isOpened()):
ret, frame = cap.read()
try :
cv2.imshow('Frame',frame)
except:
print('EOF')
break
k = cv2.waitKey(30)& 0xff
if k == 27:
breakcap.release()
cv2.destroyAllWindows()

Simpan koding tersebut, misalkan namanya adalah pertama.py ke direktori yang telah dibuat sebelumnya, yaitu c:/hitungmobil. Sehingga saat ini ada dua file di direktori tersebut.

Kemudian jalankan perintah sebagai berikut untuk menampilkan video,

c:/hitungmobil>python pertama.py

Kemudian akan muncul tampilan seperti ini. Tampilan video tidak akan berhenti sampai video selesai. Untuk memberhentikan nya, maka kita dapat mengklik Ctrl+C di command promp.

Sistem menangkap video dengan runtutan gambar per frame dalam satu detik (frame per second/fps). Kemudian gunakkan syntax sebagai berikut untuk mendapatkan fps dari video:

import cv2
vidcap = cv2.VideoCapture('M6 Motorway Traffic.mp4')
success,image = vidcap.read()
fps = vidcap.get(cv2.CAP_PROP_FPS)
totalframes = vidcap.get(cv2.CAP_PROP_FRAME_COUNT)
frame2skip = 5 # num of frames to skip when extracting
outputframe = int(totalframes / frame2skip)
print('Video FPS rate is {}'.format(fps))
print('You will get {} frames in total'.format(outputframe))
while success:
frameId = int(round(vidcap.get(1)))
success, image = vidcap.read()
if frameId % frame2skip == 0:
cv2.imwrite('frame_%d.jpg' % frameId, image)
print('Export frame {}: '.format(frameId), success)
vidcap.release()
print ('Extraction completed!')

Simpan koding tersebut di direktori yang sama, misalkan dengan nama cobafps.py. Kemudian jalankan dengan perintah berikut,

c:/hitungmobil>python cobafps.py

Ketika sukses, maka akan muncul tampilan seperti berikut,

Kemudian sistem menangkap frame tiap gambar menjadi matriks berupa angka-angka, sehingga angka-angka inilah yang mewakili tiap pixel dalam frame gambar dan ditangkap oleh sistem untuk dianalisa berikutnya.

import cv2, time
video=cv2.VideoCapture("M6 Motorway Traffic.mp4")
a=0
while True:
a=a+1
check, frame = video.read()
print(frame)
cv2.imshow("capturing", frame)
key=cv2.waitKey(1)
if key == ord('q'):
break
video.release()
cv2.destroyAllWindows()

Simpan koding di atas dengan nama matriks.py di direktori yang sama. Lalu jalankan perintah berikut,

c:/hitungmobil>python matriks.py

Setiap gambar diwakili oleh chanel RGB (Red, Green, Blue) yang bernilai antara 0–255. Untuk menampilkan video dengan chanel RGB dapat menggunakan koding berikut,

import cv2
import numpy as np

def split_to_RGB(mirror=False): #mirror digunakan untuk camera laptop

cap = cv2.VideoCapture("M6 Motorway Traffic.mp4")
cv2.namedWindow('Split RGB',cv2.WINDOW_NORMAL)
zeros = None
while True:
ret, frame = cap.read()

if ret == True:

height, width, layers = frame.shape
matrix0 = np.zeros((height, width), dtype="uint8")


(B, G, R) = cv2.split(frame)


B = cv2.merge([B, matrix0, matrix0])
G = cv2.merge([matrix0, G, matrix0])
R = cv2.merge([matrix0, matrix0, R])

final = np.zeros((height * 2, width * 2, 3), dtype="uint8")

final[0:height, 0:width] = frame
final[0:height, width:width * 2] = B
final[height:height * 2, 0:width] = G
final[height:height * 2, width:width * 2] = R

cv2.imshow('Split RGB', final)
else:
break

if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()

def main():
split_to_RGB(mirror=True)

if __name__ == '__main__':
main()

Simpan koding tersebut dengan nama splitRGB.py di direktorti yang sama. Kemudian jalankan perintah,

c:/hitungmobil>python splitRGB.py

Hasilnya akan seperti ini,

Selanjutnya kita menambahkan garis pembatas di dalam video. Hal ini dapat dilakukan dengan menambahkan koding di pertama.py sehingga kodingnya menjadi seperti ini,

import numpy as np
import cv2
cap = cv2.VideoCapture('M6 Motorway Traffic.mp4')
while(cap.isOpened()):
ret, frame = cap.read()
try :
cv2.imshow('Frame',frame)
frame2 = frame
except:
print('EOF')
break

line1 = np.array([[200,400],[700,400],[1000,400]],np.int32).reshape((-1,1,2))
line2 = np.array([[50,500],[1200,500]],np.int32).reshape((-1,1,2))
frame2 = cv2.polylines(frame2,[line1],False,(255,0,0),thickness=2)
frame2 = cv2.polylines(frame2,[line2],False,(0,0,255),thickness=2)
cv2.imshow('Frame 2',frame2)

k = cv2.waitKey(30)& 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()

Simpan koding tersebut dengan nama yang sama yaitu pertama.py, lalu jalankan perintah perikut,

c:/hitungmobil>python pertama.py

Sehingga akan muncul tampilan seperti ini. Di dalam video telah terdapat garis merah dan garis biru yang dapat mempermudah proses perhitungan mobil.

Untuk menghitung object yang ada di video kita akan gunakan metode background subtractor, dimana metode ini adalah metode yang memungkinkan gambar yang ada di depan latar belakang untuk diekstraksi.

import numpy as np
import cv2
cap = cv2.VideoCapture('M6 Motorway Traffic.mp4')
fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)
while(cap.isOpened()):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
try :
cv2.imshow('Frame',frame)
cv2.imshow('Background Subtraction',fgmask)
frame2 = frame
except:
print('EOF')
break

line1 = np.array([[200,400],[700,400],[1000,400]],np.int32).reshape((-1,1,2))
line2 = np.array([[50,400],[1200,500]],np.int32).reshape((-1,1,2))
frame2 = cv2.polylines(frame2,[line1],False,(255,0,0),thickness=2)
frame2 = cv2.polylines(frame2,[line2],False,(0,0,255),thickness=2)
cv2.imshow('Frame 2',frame2)

k = cv2.waitKey(30)& 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()

Simpan koding tersebut dengan nama kedua.py, dan jalankan perintah berikut.

c:/hitungmobil>python kedua.py

Hasilnya akan tampak seperti gambar di bawah ini.

Background Subtraction yang juga dikenal sebagai Foreground Detection, adalah salah satu teknik pada bidang pengolahan citra dan computer vision yang bertujuan untuk mendeteksi/mengambil foreground dari background untuk diproses lebih lanjut (seperti pada proses object recognition dll).

Cara kerja background subtractor adalah frame pada saat k+1, f(k+1) dikurangi dengan frame pada saat k, f(k). Frame pada saat k dianggap sebagai frame dasar atau frame tetap, sehingga perbedaan posisi gambar pada saat k+1 (diwakili oleh nilai-nilai setiap pixel dalam matriks) akan dikurangkan dengan posisi gambar pada saat k (diwakili oleh nilai-nilai setiap pixel dalam matriks).

Kemudian transformasi morfologi digunakan dalam metode ini untuk menegaskan bentuk object dengan cara menegaskan pixel yang berwarna putih ke putih dan yang berwarna hitam ke hitam. Berikut koding untuk melakukan morfologi dalam video,

import cv2
import numpy as np
def nothing(x):
pass
cap = cv2.VideoCapture("M6 Motorway Traffic.mp4")
cv2.namedWindow("Trackbars")
cv2.createTrackbar("L - H", "Trackbars", 0, 179, nothing)
cv2.createTrackbar("L - S", "Trackbars", 0, 255, nothing)
cv2.createTrackbar("L - V", "Trackbars", 0, 255, nothing)
cv2.createTrackbar("U - H", "Trackbars", 179, 179, nothing)
cv2.createTrackbar("U - S", "Trackbars", 255, 255, nothing)
cv2.createTrackbar("U - V", "Trackbars", 255, 255, nothing)
while True:
_, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
l_h = cv2.getTrackbarPos("L - H", "Trackbars")
l_s = cv2.getTrackbarPos("L - S", "Trackbars")
l_v = cv2.getTrackbarPos("L - V", "Trackbars")
u_h = cv2.getTrackbarPos("U - H", "Trackbars")
u_s = cv2.getTrackbarPos("U - S", "Trackbars")
u_v = cv2.getTrackbarPos("U - V", "Trackbars")
lower_blue = np.array([l_h, l_s, l_v])
upper_blue = np.array([u_h, u_s, u_v])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(mask, kernel)
dilation = cv2.dilate(mask, kernel)
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=2)
closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
result = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow("frame", frame)
cv2.imshow("mask", mask)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.imshow("Opening", opening)
cv2.imshow("Closing", closing)
key = cv2.waitKey(1)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()

Simpan koding tersebut dengan nama morfomobil.py di direktori yang sama, kemudian jalankan perintah,

c:/hitungmobil>python morfomobil.py

Hasilnya akan seperti berikut,

Kita bisa mengubah nilai HSV di trackbars. Saat ini yang menjadi patokan adalah nilai HSV, bukan RGB.

Kemudian membuat kontur untuk tiap object dengan menggunakan syntax berikut,

import numpy as np
import cv2
cap = cv2.VideoCapture('M6 Motorway Traffic.mp4')
fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)
kernelOp = np.ones((3,3),np.uint8)
kernelCl = np.ones((11,11),np.uint8)
while(cap.isOpened()):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
try:
ret,imBin = cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY)
mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN,kernelOp)
mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernelCl)
except:
print('EOF')
break
contours, hierarchy =cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
cv2.drawContours(frame,cnt,-1,(0,255,0),2,5)
cv2.imshow('Frame',frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap .release()
cv2.destroyAllWindows()

Simpan koding dengan nama mobilkontur.py, dan jalankan perintah berikut,

c:/hitungmobil>python mobilkontur.py

Didapatkan hasil seperti ini,

Setelah itu object ditracking dengan cara dibuat kotak untuk setiap kontur dengan menggunakan koding berikut,

import numpy as np
import cv2
cap = cv2.VideoCapture('M6 Motorway Traffic.mp4')
fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)
kernelOp = np.ones((6,6),np.uint8)
kernelCl = np.ones((11,11),np.uint8)
areaTH = 600
while(cap.isOpened()):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
try:
ret,imBin = cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY)
mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN,kernelOp)
mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernelCl)
except:
print('EOF')
break
contours, hierarchy =cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
cv2.drawContours(frame,cnt,-1,(0,255,0),2,5)
area = cv2.contourArea(cnt)
print(area)
if area>areaTH:
M=cv2.moments(cnt)
cx=int(M['m10']/M['m00'])
cy=int(M['m01']/M['m00'])
x,y,w,h=cv2.boundingRect(cnt)
cv2.circle(frame,(cx,cy),5,(0,0,255),-1)
img=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),5)
cv2.imshow('Frame',frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap .release()
cv2.destroyAllWindows()

Simpan di direktori yang sama, misal dengan nama mobilkotak.py. Kemudian jalankan perintah berikut,

c:/hitungmobil>python mobilkotak.py

Sehingga hasilnya adalah sebagai berikut,

Kemudian setiap kotak dibuat nilai rata-rata lebar dan rata-rata tinggi sehingga menemukan pusat kotak dan dibuat tracking untuk setiap object.

import numpy as np
import cv2
import Cars
import time
cap = cv2.VideoCapture('M6 Motorway Traffic.mp4')
fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)
kernelOp = np.ones((6,6),np.uint8)
kernelCl = np.ones((11,11),np.uint8)
font=cv2.FONT_HERSHEY_SIMPLEX
persons=[]
max_p_age=5
pid=1
areaTH = 600
while(cap.isOpened()):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
try:
ret,imBin = cv2.threshold(fgmask,240,255,cv2.THRESH_BINARY)
mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN,kernelOp)
mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernelCl)
except:
print('EOF')
break
contours, hierarchy =cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
cv2.drawContours(frame,cnt,-1,(0,255,0),3,5)
area = cv2.contourArea(cnt)
print(area)
if area>areaTH:
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
for i in persons:
if abs(x-i.getX())<=w and abs(y-i.getY())<=h:
new = False
i.updateCoords(cx,cy)
break
if new == True :
p = Cars.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),3)
cv2.drawContours(frame,cnt,-1,(0,255,0),3)

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)
cv2.putText(frame, str(i.getId()),(i.getX(),i.getY()),font,0.3,i.getRGB(),1,cv2.LINE_AA)
cv2.imshow('Frame',frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap .release()
cv2.destroyAllWindows()

Simpan dengan nama mobiltrack.py di direktori yang sama, lalu jalankan perintah,

c:/hitungmobil>python mobiltrack.py

Setelah setiap mobil sudah mempunyai tracking untuk nantinya dijadikan dasar dalam menghitung ketika mobil melewati batas-batas garis yang sebelumnya sudah ditentukan. Kemudan buatlah syntax seperti dibawah dan simpanan dengan nama file “countercar3.py”.

import numpy as np
import cv2
import Cars
import time
#mendefinisikan input dan output
cnt_up = 0
cnt_down = 0
#Membuka video
cap = cv2.VideoCapture('M6 Motorway Traffic.mp4')
#Dimensi (properti) video
##cap.set(3,160) #Width
##cap.set(4,120) #Height
#Meletakkan properti video ke setiap frame di video
for i in range(19):
print(i), cap.get(i)
w = cap.get(3)
h = cap.get(4)
frameArea = h*w
areaTH = frameArea/500
print ('Area Threshold'), areaTH
#Garis masuk dan keluar
line_up = int(1.85*(h/3))
line_down = int(3*(h/4))
up_limit = int(2.65*(h/5))
down_limit = int(3.5*(h/4))
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 subtractor
fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)
#Elemen struktural untuk filter morfologi
kernelOp = np.ones((3,3),np.uint8)
kernelOp2 = np.ones((5,5),np.uint8)
kernelCl = np.ones((11,11),np.uint8)
#Variabel-variabel
font = cv2.FONT_HERSHEY_SIMPLEX
cars = []
max_p_age = 5
pid = 1
while(cap.isOpened()):#Membaca gambar dari aliran video
ret, frame = cap.read()
for i in cars:
i.age_one() #tandai setiap mobil sebagai satu object
#Tahap Pra-pengolahan
#Penerapan background subtractor
fgmask = fgbg.apply(frame)
fgmask2 = fgbg.apply(frame)
#Menggunakan metode binarisasi untuk menghilangkan bayangan (color ke grey)
try:
ret,imBin= cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY)
ret,imBin2 = cv2.threshold(fgmask2,200,255,cv2.THRESH_BINARY)

#Proses Opening (erosi->dilasi) untuk menghilangkan noise
mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN, kernelOp)
mask2 = cv2.morphologyEx(imBin2, cv2.MORPH_OPEN, kernelOp)

#Proses Closing (dilasi -> erosi) untuk menghilangkan pixel ke putih
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

#Pembuatan Kontur

contours, hierarchy = cv2.findContours(mask2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
area = cv2.contourArea(cnt)
if area > areaTH:

# TRACKING
#Pengaturan untuk kondisi mobil yang jamak

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:

#object dekat dengan object yang telah terdeteksi sebelumnya
new = False
i.updateCoords(cx,cy)
#perbaharui koordinat dalam object dalam atur ulang usia (awal penandaan)
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():
#hapus object (mobil) dari daftar
index = cars.index(i)
cars.pop(index)
del i #hapus dari memori
if new == True:
p = Cars.MyCars(pid,cx,cy, max_p_age)
cars.append(p)
pid += 1

#Gambar

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)

#Akhir cnt dalam kontur


# Trayektori Gambar

for i in cars:
cv2.putText(frame, str(i.getId()),(i.getX(),i.getY()),font,0.3,i.getRGB(),1,cv2.LINE_AA)
str_up = 'Keluar: '+ str(cnt_up)
str_down = 'Masuk: '+ 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 ,(15,40),font,0.5,(200,200,200),2,cv2.LINE_AA)
cv2.putText(frame, str_up ,(15,40),font,0.5,(0,200,0),1,cv2.LINE_AA)
cv2.putText(frame, str_down ,(15,60),font,0.5,(200,200,200),2,cv2.LINE_AA)
cv2.putText(frame, str_down ,(15,60),font,0.5,(0,0,200),1,cv2.LINE_AA)
cv2.imshow('Frame',frame)
#cv2.imshow('Mask',mask)

#klik ESC untuk keluar
k = cv2.waitKey(30) & 0xff
if k == 27:
break
#Akhir untuk while(cap.isOpened())

#bersihkan layar
cap.release()
cv2.destroyAllWindows()

Selanjutnya tambahkan dan simpanlah syntax berikut,

from random import randint
import time
class MyCars:
tracks = []
def __init__(self, i, xi, yi, max_age):
self.i = i
self.x = xi
self.y = yi
self.tracks = []
self.R = randint(0,255)
self.G = randint(0,255)
self.B = randint(0,255)
self.done = False
self.state = '0'
self.age = 0
self.max_age = max_age
self.dir = None
def getRGB(self):
return (self.R,self.G,self.B)
def getTracks(self):
return self.tracks
def getId(self):
return self.i
def getState(self):
return self.state
def getDir(self):
return self.dir
def getX(self):
return self.x
def getY(self):
return self.y
def updateCoords(self, xn, yn):
self.age = 0
self.tracks.append([self.x,self.y])
self.x = xn
self.y = yn
def setDone(self):
self.done = True
def timedOut(self):
return self.done
def going_UP(self,mid_start,mid_end):
if len(self.tracks) >= 2:
if self.state == '0':
if self.tracks[-1][1] < mid_end and self.tracks[-2][1] >= mid_end: #melalui batas
state = '1'
self.dir = 'up'
return True
else:
return False
else:
return False
def going_DOWN(self,mid_start,mid_end):
if len(self.tracks) >= 2:
if self.state == '0':
if self.tracks[-1][1] > mid_start and self.tracks[-2][1] <= mid_start: #melalui batas
state = '1'
self.dir = 'down'
return True
else:
return False
else:
return False
def age_one(self):
self.age += 1
if self.age > self.max_age:
self.done = True
return True
class MultiCars:
def __init__(self, cars, xi, yi):
self.cars = cars
self.x = xi
self.y = yi
self.tracks = []
self.R = randint(0,255)
self.G = randint(0,255)
self.B = randint(0,255)
self.done = False

Simpanlah dengan nama Cars.py di direktori yang sama. Kemudian jalankan perintah berikut,

c:/hitungmobil>python mobiltrack.py

Dan, boom!

Hasil nya akan seperti ini,

Yeay! berhasil.

Referensi :

  1. https://medium.com/@986110101/object-counter-823c0fd84cfb
  2. https://pysource.com/2018/03/01/find-and-draw-contours-opencv-3-4-with-python-3-tutorial-19/
  3. https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html

--

--

Gifa Delyani Nursyafitri
Gifa Delyani Nursyafitri

Written by Gifa Delyani Nursyafitri

Ku abadikan disini, karena aku paham betul bahwa ingatan manusia terbatas.

No responses yet