0 penilaian0% menganggap dokumen ini bermanfaat (0 suara)
10 tayangan13 halaman
Program ini menggunakan metode Kalman filter untuk melakukan prediksi pergerakan bola berwarna hijau dalam video dengan mendeteksi koordinat aktual dan prediksi bola, kemudian menampilkannya dalam bentuk lingkaran pada frame video. Program hanya dapat melakukan pelacakan terhadap bola hijau.
Deskripsi Asli:
Judul Asli
Khomaril Nur Fauzi_H1A020008_Laporan Tugas Besar Praktikum ASD
Program ini menggunakan metode Kalman filter untuk melakukan prediksi pergerakan bola berwarna hijau dalam video dengan mendeteksi koordinat aktual dan prediksi bola, kemudian menampilkannya dalam bentuk lingkaran pada frame video. Program hanya dapat melakukan pelacakan terhadap bola hijau.
Program ini menggunakan metode Kalman filter untuk melakukan prediksi pergerakan bola berwarna hijau dalam video dengan mendeteksi koordinat aktual dan prediksi bola, kemudian menampilkannya dalam bentuk lingkaran pada frame video. Program hanya dapat melakukan pelacakan terhadap bola hijau.
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
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.