Anda di halaman 1dari 13

LAPORAN UNIT

PRAKTIKUM ALGORITMA DAN STRUKTUR DATA


TKE 191226

Nama : Khomaril Nur Fauzi


NIM : H1A020008
Unit Praktikum : IX

Hari / Tanggal Pelaksanaan : Selasa, 20 Juni s.d. 26 Juni 2021


Jam Pelaksanaan : 00.00 – 23.59

Asisten Kelompok : Refly Rizal M

KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN


UNIVERSITAS JENDERAL SOEDIRMAN
FAKULTAS TEKNIK
JURUSAN/PROGRAM STUDI TEKNIK ELEKTRO
PURBALINGGA
2021
UNIT IX
TUGAS BESAR
OBJECT MOVEMENT TRACKING AND PREDICTION

IX.1 Source Code


import cv2 as cv #mendefinisikan cv2 adalah cv
import numpy as np #mendefinisikan numpy sadalah np

class KalmanFilter: #membuat kelas KalmanfFilter

kf = cv.KalmanFilter(4, 2) #membuat array dua dimensi


kf.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]
], np.float32)
#membuat array didalam array
kf.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1],
[0, 0, 1, 0], [0, 0, 0, 1]], np.float32) #membuat array didala
m array

def Estimate(self, coordX, coordY): #estimasi coord untuk m


embuat lingkaran
#rumus untuk membuat lingkaran pada bola dan lingkaran untuk me
mprediksi bola
measured = np.array([[np.float32(coordX)], [np.float32(
coordY)]])
self.kf.correct(measured)
predicted = self.kf.predict()
return predicted #kembali ke predicted

#Performs required image processing to get ball coordinated in


the video
class ProcessImage:
def DetectObject(self): #mendefinisikan DetectObject

vid = cv.VideoCapture('ball.mp4')
#membaca video ball.mp4

if(vid.isOpened() == False): # Jika video tidak berada


dalam satu folder dengan kalman filter
print('Cannot open input video') # Output tulisan d
alam tanda petik
return # Mengembalikan ke fungsi
# Membuat dimensi lingkaran
width = int(vid.get(3)) # Lebar 3
height = int(vid.get(4)) # Tinggi 4

# Membuat object kalman filter


kfObj = KalmanFilter() # Assign kfObj=KalmanFilter
predictedCoords = np.zeros((2, 1), np.float32) # Koordi
nat prediksi untuk lingkaran pada bola

while(vid.isOpened()): # Jika video dalam satu folder d


an video terbuka
rc, frame = vid.read() # Membaca variabel video

if(rc == True): # Jika rc bernilai true maka akan m


endetect bola
[ballX, ballY] = self.DetectBall(frame) # Mende
teksi frame bola dalam video
predictedCoords = kfObj.Estimate(ballX, ballY)
# Mendeteksi prediksi bola dalam video

# Membuat koordinat actual dalam video


cv.circle(frame, (int(ballX), int(ballY)), 20,
[0,0,255], 2)
# Membuat lingkaran dengan diameter 20 warna bi
ru bernilai 0,warna hijau bernilai 0,dan warna merah bernilai 2
55 dan ketebalan garis 2
cv.line(frame,(int(ballX), int(ballY + 20)), (i
nt(ballX + 50), int(ballY + 20)), [100,100,255], 2)
# Membuat garis dengan y=20 dan x=20 sehingga m
embentuk garis lurus dengan panjang 50 dengan warna biru bernil
ai 100,warna hijau bernilai 100,dan warna merah bernilai 255] d
engan ketebalan 2
cv.putText(frame, "Actual", (int(ballX + 50), i
nt(ballY + 20)), cv.FONT_HERSHEY_SIMPLEX,0.5, [50,200,250])
# Membuat tulisan Actual dengan jarak 50 dari t
itik x dan 20 dari titik y dengan besar huruf 0.5 dan warna bir
u bernilai 50,warna hijau bernilai 200,dan warna merah bernilai
250

# Membuat keluaran prediksi Kalman Filter


cv.circle(frame, (int(predictedCoords[0]), int(
predictedCoords[1])), 20, [0,255,255], 2)
# Membuat lingkaran koordinat bernilai [0] dan
[1] dengan diameter 20 warna biru bernilai 0,warna hijau bernil
ai 255,dan warna merah bernilai 255] dan ketebalan garis 2
cv.line(frame, (int(predictedCoords[0] + 16), i
nt(predictedCoords[1] - 15)), (int(predictedCoords[0] + 50), in
t(predictedCoords[1] - 30)), [100, 10, 255], 2)
# Membuat garis dengan nilai 16 dari koordinat[
0] dan nilai 15 dari koordinat[1] sehingga membentuk garis luru
s
# Nilai 50 dari koordinat[0] dan nilai 30 dari
koordinat[1] untuk membuatnya miring dengan warna biru bernilai
100,warna hijau bernilai 100,dan warna merah bernilai 255 deng
an ketebalan 2
cv.putText(frame, "Predicted", (int(predictedCo
ords[0] + 50), int(predictedCoords[1] - 30)), cv.FONT_HERSHEY_S
IMPLEX, 0.5, [50, 200, 250])
# Membuat tulisan Predicted dengan nilai 50 dar
i koordinat[0] dan nilai 30 dari koordinat[1]
# Dengan besar huruf 0.5 dan warna biru bernila
i 50, warna hijau bernilai 200, dan warna merah bernilai 250
cv.imshow('Input', frame)
# Membuat inputan mengikuti frame pada bola dal
am video

if (cv.waitKey(300) & 0xFF == ord('q')):


# Angka 300 untuk cepat lambatnya video dan per
gerakan frame lingkaran dan tulisan agar hasil prediksi maksima
l
# Q adalah inputan keluar dari program
break
# Program dihentikkan sementara

else: # Jika kondisi lain


break # Program akan dihentikkan sementara
vid.release()
# Mengehentikkan video kemudian
cv.destroyAllWindows()
# Program not responding

# Membuat frame untuk mendeteksi bola


def DetectBall(self, frame):

# Metode untuk mendeksi Opencv dengan mendeteksi warna


dengan array 2D
lowerBound = np.array([130,30,0], dtype = "uint8")
# Array yang dideteksi, warna hijau
upperBound = np.array([255,255,90], dtype = "uint8")
# Array yang dideteksi, warna hijau
greenMask = cv.inRange(frame, lowerBound, upperBound) #
mendeteksi warna

# Dilate untuk masking, video akan fokus kebenda yang d


ituju(warna hijau)
kernel = np.ones((5, 5), np.uint8)
greenMaskDilated = cv.dilate(greenMask, kernel)
# Membuat masking video akan fokus kebenda yang dituju
yaitu bola warna hijau

# Find ball blob as it is the biggest green object in t


he frame
[nLabels, labels, stats, centroids] = cv.connectedCompo
nentsWithStats(greenMaskDilated, 8, cv.CV_32S)
# Mencari benda berwarna hijau berukuran paling besar,
jika tidak diberi ini maka benda dengan pixel kecil berwarna hi
jau akan terdeteksi semua

# First biggest contour is image border always, Remove


it
# Mencari koordinat bola yang akan dicari
stats = np.delete(stats, (0), axis = 0)
try:
maxBlobIdx_i, maxBlobIdx_j = np.unravel_index(stats
.argmax(), stats.shape)

# This is our ball coords that needs to be tracked


ballX = stats[maxBlobIdx_i, 0] + (stats[maxBlobIdx_
i, 2]/2)
ballY = stats[maxBlobIdx_i, 1] + (stats[maxBlobIdx_
i, 3]/2)
return [ballX, ballY] # Kembali ke ballX, ballY
except:
pass

return [0,0] # Kembali ke [0,0]

# Main Function
def main(): # Memanggil fungsi main (semua fungsi)

processImg = ProcessImage() # Memproses image


processImg.DetectObject() # Memproses objek

if __name__ == "__main__": # Menjalankan oop


main() # Menjalankan fungsi utama

print('Program Completed!') # Jika program main telah terpanggi


l maka muncul “program completed”
IX.2 Pembahasan
OpenCV adalah sebuah library yang digunakan untuk mengolah gambar dan video. Library
OpenCV tidak tersedia di python secara default, jadi perlu dilakukan penambahan library OpenCV
dengan memasukkan OpenCV kedalam command prompt kemudian python akan otomatis
membaca library OpenCV tersebut. OpenCV ini akan digunakan untuk melakukan pengolahan
pada video yang akan dianalisa. Selain dapat membaca file video, OpenCV juga dapat melakukan
pengolahan gambar secara realtime yakni dengan mengakses gambar yang ditangkap oleh webcam
atau kamera. OpenCV dapat juga digunakan dalam bahasa lain seperti C++ dan Java. Program
nantinya akan mengolah dan menganalisa prediksi pergerakan bola memantul pada video
menggunakan OpenCV dengan metode kalman filter.
Kalman filter merupakan estimator rekursif yang digunakan untuk melakukan estimasi suatu
nilai. Untuk menggunakan kalman filter, pergerakan objek antarframe diasumsikan konstan. Status
dari objek yang dilacak dapat dinyatakan dengan atribut seperti posisi, kecepatan atau ukuran objek
tersebut. Metode ini menggunakan infomasi dari objek yang terdeteksi di suatu frame dan status
objek tersebut dari frame sebelumnya untuk mendapatkan status yang baru.
Program ini dibuat dengan library OpenCV dan dengan metode kalman filter. Metode
kalman filter digunakan untuk melakukan prediksi pergerakan dari sebuah bola berwarna hijau.
Prediksi yang dilakukan melibatkan banyak data yang didapat dari pergerakan data sebelumnya
ataupun data-data lain yang dianggap tidak mempengaruhi namun masih dimanfaatkan oleh
kalman filter untuk melakukan prediksi gerakan bola.
Program akan menampilkan output berupa video bola yang memantul yang diikuti lingkaran
actual dan lingkaran prediksi. Program ini hanya dapat melakukan tracking dan prediksi terhadap
gerakan bola yang berwarna hijau, selain bola warna hijau belum dapat dilakukan tracking. Hal
ini, kurang efektif, dikarenakan dalam video versi penuh, bola yang digunakan memiliki beragam
warna dan ukuran. Jadi untuk mengatasi hal tersebut video yang diambil adalah bagian bola yang
berwarna hijau saja.
Singkatnya, cara kerja program adalah dengan memasukan video ke dalam satu file dengan
program, kemudian OpenCV akan mendeteksinya dan mengolah data-data yang didapat dari video
untuk mendapatkan koordinat actual dan prediksi pergerakan bola menggunakan metode kalman
filter.
Rincinya, cara kerja program ini diawali dengan pemanggilan library cv2 dari library
OpenCV, dan numpy untuk menyimpan data dalam bentuk array dua dimensi. Kemudian dibuat
class KalmanFilter dimana class ini akan melakukan metode kalman filtering pada objek yang
ditayangkan. Pada class ini terdapat tiga static variabel, dan satu buah method fungsi estimasi. Tiga
static variabel ini adalah berupa matriks yang didefinisikan menggunakan numpy, method yang
dipanggil berupa measurmentMatrix dan transisitionMatrix dari class KalmanFilter. Matriks
tersebut tercipta dari array dua dimensi dan array tiga dimensi. Pembuatan method estimate ini
berfungsi untuk melakukan estimasi posisi dari bola berdasarkan koordinat pada posisi
sebelumnya. Kemudian, mendefinisikan class ProcessImage, pada class ini dibuat dua buah
method yaitu DetectObject dan DetectBall. Pada method DetectObject dibuat variabel untuk
menandai video yang diinputkan. Setelahnya dilakukan kondisional ketika video tidak dapat
ditemukan dalam satu folder maka program akan menampilkan output “Cannot open input video”
yang artinya video yang diinputkan tidak bias dibuka. Pada method ini dibuat sebuah objek untuk
class KalmanFilter, kemudian variabel PredictedCoords. Setelah itu dibuat kondisi looping dengan
menggunakan while yang dijalankan ketika video ditemukan dan dapat dibuka. Dalam looping ini
dibuat kondisi dimana video masih ditampilkan maka akan dilakukan beberapa perintah untuk
memasukan nilai pada variabel array BallX, BallY dan juga memasukan nilai pada variabel
PredictedCoords , dan juga pada looping ini dibuat perintah untuk menggambarkan lingkaran untuk
posisi actual dan posisi prediksi pada bola yang ada pada file video yang sedang ditampilkan.
Kemudian, looping diatur lambat untuk membuat hasil dari prediksi maksimal, kemudian input
tombol ‘q’ pada keyboard berfungsi untuk mengeluarkan program. Kondisional berikutnya ketika
video tidak tayang akan langsung menyelesaikan program. Pada kondisi video ditemukan maka
ditampilkan video. Method DetectBall dilakukan untuk pengolahan agar mendapatkan posisi dari
bola warna hijau. Kemudian fungsi main, dimana pada fungsi ini adalah fungsi utama program
akan dijalankan, dalam fungsi ini dibuat sebuah method untuk class ProcessImage dan juga objek
memanggil method DetectObject. Dengan ini program akan menjalankan perintah- perintah yang
telah didefinisikan sebelumnya. Selanjutnya terdapat perintah kondisional agar menjalankan
fungsi main. Ketika program selesai dijalankan maka akan ditampilkan output “Program
Completed” yang artinya program telah selesai dijalankan.
Tujuan program ini adalah untuk membuat lingkaran actual dan prediksi pemantulan bola
dalam video dengan cara tracking dan masking objek dalam video yaitu bola hijau.
Gambar 9.1 Output program kalmanfilter.py

Gambar 9.2 Output pada terminal program kalmanfilter.py


IX.3 Kesimpulan
1. Dapat melakukan penambahan library OpenCV ke python.
2. Memahami kegunaan OpenCV.
3. Memahami penggunaan metode kalman filter.
4. Metode kalman filter digunakan untuk melakukan prediksi ataupun estimasi nilai.
5. Program yang telah dibuat memanfaatkan class, instance, dan static variable.
6. Program hanya dapat mendeteksi objek bola hijau, dikarenakan masking yang dilakukan
hanya terdapat objek yang berwarna hijau yang cukup besar.

Note :
OK!
Lampiran

Anda mungkin juga menyukai