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
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.
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
Video data Ekstraksi menjadi frame Manual marker Algoritma bezier Lintasan marker Analisa gait Parameter kuantitatif dari gait(a)
(b)
(c)
(d) (e) (f)
(g)
framenya sehingga dapat dibuat suatu lintasan marker, (g) lintasan marker
digunakan untuk pengukuran gait secara kuantitatif.
Tampikkan status start Load ? Tampilkan video yang akan dianalisa Def
ground ? Tentukan letak ground
Marker? Tentukan marker pada gambar Tentukan jarak marker dari ground 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
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
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 untuk
mengekstraksi video menjadi frame dapat dilihat pada gambar 3.4.
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.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.
Gambar 3.5 Source code peletakan frame pada array yang disediakan
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
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
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.
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.
Gambar 3.7 Source code penentuan jarak marker dari ground
MarkerID = 0 RBmarker1.Checked = True MarkerBrush(0) = Brushes.Red RBmarker1.ForeColor = Color.Red MarkerPen(0) = Pens.Red warna(0) = Color.Red
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
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.
Gambar 3.8 Source code pengaktifan tombol
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.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.
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
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
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.
Gambar 3.11 Source code perintah mundur dengan step 1
Gambar 3.12 Source code perintah mundur dengan step 10
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()
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()
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) = P
0+ (P
1- P
0)t = (1-t) P
0+ t P
1, t Є [0,1]
Di mana t adalah fungsi dari kurva linier Bezier yang dapat
mendiskripsikan sejauh mana B(t) dari P
0dan P
1. Sebagai contoh ketika t=0.25,
B(t) adalah seperempat jalan dari titik P
0menuju P
1.Dimana t dari 0 sampai 1,
B(t) mendiskripsikan kurva dari P
0menuju P
1. Kode yang digunakan dapat dilihat
pada gambar 3.13.
Gambar 3.13 Source code penentuan marker
3.9 Tombol Analyze marker
Tombol ini digunakan untuk melihat lintasan dari marker yang telah
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
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
Gambar 3.14 Source code analisa marker
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) = 255 con(1, pq) = 255 con(2, pq) = 255 con(3, pq) = 255 Next 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