Bab III Perancangan Dan Realisasi Perangkat Lunak Perangkat lunak yang digunakan dalam metode penentuan marker dari pengambilan gambar tanpa marker dengan menggunakan kurva linier Bezier adalah Visual Basic.NET Pembahasan dalam bab ini terutama di tekankan pada algoritma pemrograman.
3.1 Diagram blok dan cara kerja sistem Masukan dari sistem ini adalah gambar video yang diambil melalui kamera video dari satu arah. Pengambilan gambar pasien dapat di mana saja dan dengan mengenakan pakaian bebas, tidak ada ketentuan. Hasil dari rekaman video ini lah yang kemudian diproses dengan menggunakan software yang telah dibuat pada komputer. Komputer yang digunakan memiliki spesifikasi sebagai berikut: prosesor Intel Core 2 Duo E4500 2.20GHz, RAM 1 GB, kartu grafis ATI Mobility Radeon X1600, dan hard disk 160GB. Perangkat lunak yang digunakan untuk mendukung perancangan sistem ini adalah sistem operasi Windows XP Home Edition dan Visual Basic.NET. Cara kerja dari sistem ini adalah , gambar video pasien yang telah diambil tanpa marker kemudian ditampilkan pada display program yang telah disediakan. Selanjutnya gambar tersebut disimpan dalam bentuk frame dengan menggunakan metode video frame reader yang fungsinya adalah mengekstrasi video menjadi frame dan kemudian frame-frame tersebut disimpan dalam array yang disiapkan. Selanjutnnya, gambar dari pasien yang akan dianalisa ini diberi marker secara manual pada titik-titik yang ingin dianalisa. Dalam perangkat lunak ini disediakan 8 marker yang dapat diletakkan ditempat yang dikehendaki untuk dianalisa, misalnya diletakkan pada mata kaki atau pada persendian di bagian lutut. Pemberian marker ini cukup pada beberapa frame saja, untuk selanjutnya perangkat lunak yang dibuat akan memprediksi letak marker-marker yang lain antara 2 titik marker yang telah ditentukan dengan metode kurva Bezier.
27
Hasil prediksi letak marker dengan menggunakan metode kurva Bezier ini lah yang nantinya berupa lintasan marker untuk selanjutnya dianalisa apakah pasien tersebut menderita gangguan pada cara berjalannya atau dalam kondisi normal. Dalam program yang dibuat, juga dapat dilakukan koreksi secara manual, sehingga
bila ada penyimpangan yang cukup jauh pada perhitungan marker
dengan kurva Bezier, pengguna dapat menyisipkan marker secara manual pada frame yang terjadi penyimpangan. Dengan demikian diharapkan lintasan dari marker yang dihasilkan mendekati lintasan yang seharusnya. Selain itu, program yang dibuat juga menyediakan analisa marker yang befungsi untuk menghubungkan marker yang dikehendaki pada setiap framenya. Dari sini dapat dianalisa sudut dari pasien untuk selanjutnya dikategorikan sesuai parameter gait. Diagram blok dan diagram alir dari perangkat lunak yang dibuat dapat dilihat pada gambar 3.1 dan 3.2. Algoritma pemrograman
dijelaskan dalam
tulisan selanjutnya.
(a) Video data
(b) Ekstraksi (c) menjadi frame
Manual marker
(d) Algoritma (e) Lintasan bezier
marker
(f) Analisa gait
(g) Parameter
kuantitatif dari gait
Gambar 3.1 Diagram blok gait analisis tanpa marker (a) gambar pasien yang direkam dengan kamera video, (b) video pasien sebagi masukan dari sistem, (c) video pasien di ekstrak menjadi frame dan diletakkan pada array, (d) peletakan manual marker pada beberapa frame sebagai referensi, (e) penentuan marker yang belum diketahui dengan algoritma kurva bezier, (f) didapatkan marker setiap
28
framenya sehingga dapat dibuat suatu lintasan marker, (g) lintasan marker digunakan untuk pengukuran gait secara kuantitatif.
start
Tampikkan status
Load ?
Tampilkan video yang akan dianalisa
Def ground ?
Tentukan letak ground
Tentukan marker pada gambar Tentukan jarak marker dari ground
Marker?
Maju mundur ?
Gerakkan frame sesuai perintah maju atau mundur
Play ?
Play video Play marker yang sudah ditentukan bila ada
Analisa marker ?
Tampilkan garis antar marker yang ingin dianalisa
Stop ?
Berhenti pada frame yang diinginkan
end
29
Gambar 3.2 Diagram alir gait analisis tanpa marker
3.2 Deklarasi variabel member Program penentuan marker pada pengambilan gerakan manusia tanpa marker dengan metode kurva Bezier berbasis VB.NET untuk analisa gait adalah sebagai berikut, pertama yaitu pendeklarasian variabel member, yaitu variabel yang akan digunakan atau diakses di seluruh prosedur. Contoh Soure code deklarasi variabel dapat dilihat pada gambar 3.3 Public Class Form1 Dim frameku As Bitmap, framepos As Double, frameincrement As Double Dim MoviePath As String = "" Dim lblJarak(7) As Label, warna(7) As Color, skala As Single = 0.52 Dim drawAnalysis As Boolean = False Dim MarkerID As Integer = 0, MarkerDraw As Integer Dim MarkerBrush(7) As System.Drawing.Brush, MarkerPen(7) As System.Drawing.Pen Dim i As Single = 0 Dim KFBoundStart As Int32 = -1 Dim KFBoundStop As Int32 Dim flag(-1, 0) As Boolean Dim X(-1, 0) As Single Dim Y(-1, 0) As Single
Gambar 3.3 Source code deklarasi variabel 3.3 Ektraksi video menjadi frame Untuk mengekstraksi video menjadi frame diperlukan metode Video Frame Reader. Metode ini dapat digunakan untuk GetFrameFromVideo, GetVideoSize dan SaveFrameFromVideo pada aplikasi VB. Dengan menambahkan reference JockerSoft.Media.dll dan. Interop.DexterLib.dll pada proyek VB.NET yang dibuat. Metode ini dapat bekerja pada jenis file .avi dan .wmv juga file .mpg. Tetapi metode ini tidak dapat bekerja pada file .dvr-ms, cara ini tidak dapat mengektraksi langsung dari rekaman televisi. Kode yang digunakan mengekstraksi video menjadi frame dapat dilihat pada gambar 3.4.
30
untuk
Imports DexterLib Imports JockerSoft.Media Imports System.Drawing Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click framepos = 0 frameincrement = 0.01 MoviePath = "D:\thesis\edit_aryo.00.avi" frameku = FrameGrabber.GetFrameFromVideo(MoviePath, framepos) lblTime.Text = framepos.ToString
Gambar 3.4 Source code video frame reader dan load video Setelah video diekstrak menjadi beberapa frame, maka frame-frame tersebut diletakkan pada array yang dibuat. Dalam program ini video dibuat memiliki durasi 100 Step atau langkah tiap framenya dibuat satu frame per satu langkah, jadi ada 100 frame dalam satu video. Kode yang digunakan untuk meletakkan frame yang telah diekstrak, pada array yang disediakan dapat dilihat pada gambar 3.5. Dim dur As Integer = 100 Dim p As Integer, q As Integer ReDim flag(7, dur) ReDim X(7, dur) ReDim Y(7, dur) For p = 0 To (flag.Length / 8) - 1 For q = 0 To 7 flag(q, p) = False Next Next For p = 0 To (X.Length / 8) - 1 For q = 0 To 7 X(q, p) = -10 Y(q, p) = -10 Next Next
Gambar 3.5 Source code peletakan frame pada array yang disediakan
31
3.4 Deklarasi marker yang digunakan dan perhitungan jarak marker dengan ground Ada 8 marker yang digunakan, masing-masing dibedakan dengan perbedaan warnanya. Marker ini digunakan untuk menentukan bagian tubuh pasien yang akan dianalisa. Marker pertama berwarna merah, kedua dan seterusnya adalah hijau, biru, kuning, abu-abu, putih, ungu, dan merah muda. Kode yang digunakan untuk menentukan urutan dari marker dapat dilihat pada gambar 3.6.
MarkerID = 0 RBmarker1.Checked = True MarkerBrush(0) = Brushes.Red RBmarker1.ForeColor = Color.Red MarkerPen(0) = Pens.Red warna(0) = Color.Red
Gambar 3.6 Source code marker pertama Jarak tiap marker ke ground dapat dilihat pada label jarak. Algoritma perhitungan jarak adalah nilai absolut dari selisih letak antara marker dan ground dikalikan dengan skala, dimana skala ditentukan 0.52 cm per pixel dengan perhitungan ukuran pengambilan gambar sebenarnya adalah 150 cm untuk 285 pixel. Sehingga 150 cm dibagi 285 pixel didapat 0.52 cm per pixel. Kode yang digunakan dapat dilihat pada gambar 3.7. Sub HitungJarakGND(ByVal DataSekarang As Integer) Dim r As Integer Dim deltaY As Single For r = 0 To 7 lblJarak(r).ForeColor = warna(r) If Y(r, DataSekarang) < 0 Then lblJarak(r).Text = "No data" Else deltaY = Math.Abs(YGnd - Y(r, DataSekarang)) * skala lblJarak(r).Text = deltaY.ToString End If Next
Gambar 3.7 Source code penentuan jarak marker dari ground
32
3.5 Tombol Load, Play, dan Stop Tombol yang pertama-tama bisa dioperasikan adalah tombol load, Sebelum tombol yang lain dapat digunakan, film yang akan dianalisa harus dipanggil terlebih dahulu dengan tombol ini. Tombol Play digunakan untuk memainkan film yang akan dianalisa, sedangkan tombol Stop digunakan untuk menghentikan film pada frame yang diinginkan. Kode yang digunakan untuk mengaktifkan tombol ini dapat dilihat pada gambar 3.8 dan 3.9. Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick If movieLoaded = True Then btnFF.Enabled = True btnFB.Enabled = True btnPrev.Enabled = True btnNext.Enabled = True btnPlay.Enabled = True btnStop.Enabled = True PictureBox1.Enabled = True lblArray.Text = Vcount lblTime.Text = framepos Else btnFF.Enabled = False btnFB.Enabled = False btnPrev.Enabled = False btnNext.Enabled = False btnPlay.Enabled = False btnStop.Enabled = False PictureBox1.Enabled = False lblArray.Text = "" lblTime.Text = "" End If End Sub
Gambar 3.8 Source code pengaktifan tombol
33
Private Sub btnPlay_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPlay.Click If btnPlay.Text = "Play" Then playDot = True framepos = 0 dotCnt = 0 TimerDot.Enabled = True Exit Sub Else btnPlay.Text = "Playing.." playDot = False TimerDot.Enabled = False Exit Sub End If End Sub Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click playDot = False End Sub
Gambar 3.9 Source code dari perintah play dan stop
3.6 Display video yang dianalisa Video yang dianalisa diletakkan pada sebuah picturebox. Film akan muncul setelah tombol load diaktifkan. Dalam picturebox ini langsung dapat ditentukan letak ground dan marker yang diinginkan. Code yang digunakan dapat dilihat pada gambar 3.10. Setelah gambar muncul pada display picturebox , maka pertama-tama ground didefinisikan untuk mengukur jarak pada setiap marker yang diberikan, code yang digunakan dapat dilihat pada gambar 3.10. Kemudian untuk menggerakkan frame ke depan dan belakang diperlukan algoritma pergerakan frame, Kode yang digunakan dapat dilihat pada gambar 3.10.
34
Private Sub PictureBox1_click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp 'mendefinisikan ground If DefGround = True Then YGnd = e.Y DefGround = False 'frame bergerak ke depan dan ke belakang Else If KFBoundStart = -1 Then KFBoundStart = Vcount End If If Vcount < KFBoundStart Then KFBoundStart = Vcount End If Me.Text = e.X.ToString + ":" + e.Y.ToString flag(MarkerID, Vcount) = True X(MarkerID, Vcount) = e.X Y(MarkerID, Vcount) = e.Y Dim PrevKF As Integer = 0, NextKF As Integer = 0, i As Integer If Vcount > 0 Then 'frame bergerak ke belakang (hitung ke belakang) For i = Vcount - 1 To KFBoundStart Step -1 If flag(MarkerID, i) = True Then PrevKF = i Exit For End If Next HitungTitik(MarkerID, X(MarkerID, PrevKF), Y(MarkerID, PrevKF), X(MarkerID, Vcount), Y(MarkerID, Vcount), PrevKF, Vcount) 'frame bergerak ke depan (hitung ke depan) Dim found As Boolean = False For i = Vcount + 1 To KFBoundStop Step 1 If flag(MarkerID, i) = True Then NextKF = i found = True Exit For End If Next If found = True Then HitungTitik(MarkerID, X(MarkerID, Vcount), Y(MarkerID, Vcount), X(MarkerID, NextKF), Y(MarkerID, NextKF), Vcount, NextKF) End If End If End If IsClicked = True PictureBox1.Refresh() IsClicked = False End Sub
Gambar 3.10 Source code dari display video dan algoritma pergerakan frame
35
3.7 Tombol maju dan mundur Tombol ini digunakan untuk bergerak maju atau mundur. Tombol ini terbagi menjadi 2 jenis, yang pertama dengan langkah atau step 1 dan yang kedua dengan langkah atau step 10. Kode yang digunakan dapat dilihat pada gambar 3.11 dan 3.12. Private Sub btnPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrev.Click Vcount = Vcount - 1 If Vcount < 0 Then Vcount = 0 HitungJarakGND(Vcount) Dim www As Integer lblTime.ForeColor = Color.Black For www = 0 To 7 If flag(www, Vcount) = True Then lblTime.ForeColor = Color.LimeGreen Exit For End If Next i = i - frameincrement If i < 0 Then i = 0 framepos = i IsClicked = False PictureBox1.Refresh()
Gambar 3.11 Source code perintah mundur dengan step 1 Private Sub btnFB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFB.Click Vcount = Vcount - 10 If Vcount < 0 Then Vcount = 0 HitungJarakGND(Vcount) Dim www As Integer lblTime.ForeColor = Color.Black For www = 0 To 7 If flag(www, Vcount) = True Then lblTime.ForeColor = Color.LimeGreen Exit For End If Next i = i - frameincrement * 10 If i < 0 Then i = 0 framepos = i IsClicked = False PictureBox1.Refresh()
Gambar 3.12 Source code perintah mundur dengan step 10
36
3.8 Algoritma penentuan marker Metode untuk menentukan letak marker dari frame yang belum ditentukan markernya adalah dengan menggunakan kurva Bezier. Kurva Bezier banyak digunakan untuk memodelkan kurva yang halus pada aplikasi grafik di komputer. Metode dari kurva Bezier adalah dengan mengevaluasi beberapa titik yang saling berdekatan dan memperkirakan urutan bagian-bagian garis. Jika terdapat 2 titik, yaitu P0 dan P1, kurva linier Bezier berupa garis lurus dengan persamaan antara 2 titik yang diberikan sebagai berikut: B(t) = P0 + (P1- P0)t = (1-t) P0 + t P1 , t Є [0,1] Di mana t adalah fungsi dari kurva linier Bezier yang dapat mendiskripsikan sejauh mana B(t) dari P0 dan P1. Sebagai contoh ketika t=0.25, B(t) adalah seperempat jalan dari titik P0 menuju P1. Dimana t dari 0 sampai 1, B(t) mendiskripsikan kurva dari P0 menuju P1. Kode yang digunakan dapat dilihat pada gambar 3.13.
Sub HitungTitik(ByVal MID As Integer, ByVal x0 As Integer, ByVal y0 As Integer, ByVal x1 As Integer, ByVal y1 As Integer, ByVal prevKF As Integer, ByVal nowKF As Integer) Dim NewY As Single, NewX As Single Dim langkah As Single langkah = (x1 - x0) / (nowKF - prevKF) Dim icount As Integer = prevKF NewX = x0 For icount = prevKF To nowKF NewY = (y1 - y0) * (NewX - x0) + y0 X(MID, icount) = NewX Y(MID, icount) = NewY NewX = NewX + langkah
Gambar 3.13 Source code penentuan marker
3.9 Tombol Analyze marker Tombol ini digunakan untuk melihat lintasan dari marker yang telah ditentukan, selain itu tombol ini juga berfungsi untuk menghubungkan marker yang ingin dianalisa sudutnya dengan cara memberi input pada kotak chanel yang
37
tersedia. Karena ada 8 buah marker yang tersedia maka diperlukan 4 buah chanel yang harus disediakan sehingga dapat memuat 4 kombinasi marker yang berbeda dengan minimal 2 buah marker dan maksimal 8 buah marker setiap chanelnya. Dari hasil lintasan inilah dapat dilihat ada tidaknya kelainan gait pada pasien. Kode yang digunakan dapat dilihat pada gambar 3.14
Private Sub BtnAnalyze_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAnalyze.Click If BtnAnalyze.Text = "Analyze" Then drawAnalysis = True BtnAnalyze.Text = "Analyzing..." tbCh1.Text = tbCh1.Text.Trim tbCh2.Text = tbCh2.Text.Trim tbCh3.Text = tbCh3.Text.Trim tbCh4.Text = tbCh4.Text.Trim Dim pq As Byte For pq = 0 To 7 con(0, pq) = con(1, pq) = con(2, pq) = con(3, pq) = Next
255 255 255 255
If tbCh1.Text <> "" Then Ch1Conn = tbCh1.Text.Split("-") For pq = 0 To 7 If pq <= Ch1Conn.Length - 1 Then con(0, pq) = Val(Ch1Conn(pq)) - 1 Else con(0, pq) = 255 End If Next End If
Gambar 3.14 Source code analisa marker
38