Anda di halaman 1dari 123

UNIVERSITAS INDONESIA

REKONSTRUKSI PERMUKAAN TIGA DIMENSI


DENGAN PENDEKATAN VISI STEREO

SKRIPSI

MOHAMMAD AGUNG WIBOWO


0706271922

FAKULTAS ILMU KOMPUTER


PROGRAM STUDI ILMU KOMPUTER
DEPOK
JULI 2012

UNIVERSITAS INDONESIA

HALAMAN JUDUL
SKRIPSI
Diajukan sebagai salah satu syarat
untuk memperoleh gelar Sarjana Ilmu Komputer

MOHAMMAD AGUNG WIBOWO


0706271922

FAKULTAS ILMU KOMPUTER


PROGRAM STUDI ILMU KOMPUTER
DEPOK
JULI 2012

HALAMAN PERNYATAAN ORISINALITAS

Skripsi ini adalah hasil karya saya sendiri, dan semua sumber baik yang
dikutip maupun dirujuk telah saya nyatakan dengan benar.

Nama

: Mohammad Agung Wibowo

NPM

: 0706271922

Tanda Tangan

Tanggal

: 15 Juli 2012

ii

HALAMAN PENGESAHAN

Skripsi ini diajukan oleh :


Nama

: Mohammad Agung Wibowo

NPM

: 0706271922

Program Studi

: Ilmu Komputer

Judul Skripsi

: Rekonstruksi

Permukaan

Tiga

Dimensi

dengan

Pendekatan Visi Stereo

Telah berhasil dipertahankan di hadapan Dewan Penguji dan diterima


sebagai bagian persyaratan yang diperlukan untuk memperoleh gelar
Sarjana Ilmu Komputer dari Program Studi Ilmu Komputer, Fakultas Ilmu
Komputer, Universitas Indonesia.

DEWAN PENGUJI

Pembimbing : M. Ivan Fanany S.Si, M.Kom, Ph.D.

Penguji

: Drs. Lim Yohanes Stefanus, M.Math., Ph.D. (

Penguji

: Prof. Dr. Ir. Aniati Murni Arymurthy, M.Sc. (

Ditetapkan di : Depok
Tanggal

: 15 Juli 2012

iii

KATA PENGANTAR

Ucap syukur dan terimakasih selalu terurai bagi tuhan semesta alam yang
Maha Berkehendak, Allah swt. Salam selamat semoga selalu tercurah bagi
pribadi yang telah menunjukkan eksistensinya sebagai pemimpin yang patut
diteladani, Muhammad saw.
Skripsi ini merupakan catatan akhir penulis yang menyempurnakan
perjuangan selama 10 semester di Fakultas Ilmu Komputer Universitas
Indonesia. Dalam pembuatan skripsi ini, ada banyak pihak yang berjasa bagi
penulis dan membantu penulis baik secara langsung maupun tidak langsung.
Dalam lembaran kecil ini, penulis berkeinginan untuk mengucapkan
terimakasih kepada pihak-pihak yang berjasa tersebut, yaitu:
1. Ibu, Bapak, Kakak, Adik, dan seluruh keluarga yang selalu memberikan
dorongan dan motivasi.
2. Bapak Ivan Fanany yang senantiasa memberikan ilmu dan pengarahan.
3. Seluruh Dosen Fasilkom UI yang telah memberikan banyak ilmu dan
motivasi.
4. Teman-teman KANGKUNG.
5. Teman-teman staf pengajar BTA 8 Depok yang selalu memberikan
dorongan dan semangat.
6. Juga kepada teman dan sanak saudara lainnya yang tak cukup untuk
dituliskan satu per satu di sini.
Akhir kata, semoga skripsi ini bisa memberikan manfaat dan semoga semua
pihak yang telah berjasa mendapatkan balasan kebaikan dari Allah swt.
Depok, 15 Juli 2012
Penulis

iv

HALAMAN PERNYATAAN PERSETUJUAN PUBLIKASI


TUGAS AKHIR UNTUK KEPENTINGAN AKADEMIS

Sebagai sivitas akademik Universitas Indonesia, saya yang bertanda tangan di


bawah ini:

Nama

: Mohammad Agung Wibowo

NPM

: 0706271922

Program Studi : Ilmu Komputer


Departemen

:-

Fakultas

: Ilmu Komputer

Jenis Karya

: Skripsi

Demi pengembangan ilmu pengetahuan, menyetujui untuk memberikan kepada


Universitas Indonesia Hak Bebas Royalti Noneksklusif (Non-exclusive RoyaltyFree Right) atas karya ilmiah saya yang berjudul:

Dengan Hak Bebas Royalti Noneksklusif ini Universitas Indonesia berhak


menyimpan, mengalihmediaformat-kan, mengelola dalam bentuk pangkalan data
(database), merawat, dan memublikasikan tugas akhir saya selama tetap
mencantumkan nama saya sebagai penulis/pencipta dan sebagai pemilik Hak
Cipta.

Demikian pernyataan ini saya buat dengan sebenarnya.

Dibuat di

: Depok

Pada tanggal : 15 Juli 2012

Yang menyatakan

Mohammad Agung Wibowo

ABSTRAK

Nama
: Mohammad Agung Wibowo
Program Studi : Ilmu Komputer
Judul
: Rekonstruksi Permukaan Tiga Dimensi dengan Pendekatan Visi
Stereo

Rekonstruksi tiga dimensi objek masih menjadi bahasan yang belum kunjung usai
saat ini. Berbagai macam metode dan penelitian terus dikembangkan untuk
semakin menyempurnakan hasil dari proses rekonstruksi objek sekaligus
mengurangi biaya komputasi. Ada berbagai pendekatan yang bisa dilakukan untuk
merekonstruksi objek. Pendekatan yang dilakukan dalam penelitian ini ialah
dengan menggunakan visi stereo yang bersifat pasif. Proses rekonstruksi
dilakukan dengan menggunakan kamera stereo yang telah melalui proses
kalibrasi. Pada tahapan rektifikasi, digunakan algoritma Bouget untuk melakukan
penyerasian baris. Pada tahapan korespondensi, digunakan algoritma blockmatching stereo yang menggunakan metode SAD untuk menemukan fitur yang
bersesuaian. Pengukuran kedalaman dilakukan dengan metode triangulasi
berdasarkan informasi disparity. Sistem dikembangkan dalam bahasa C++ dan
menggunakan library OpenCV. Untuk melakukan visualisasi, digunakan Point
Cloud Library (PCL).
Kata kunci: Visi komputer stereo, visi stereo pasif, kalibrasi stereo, rektifikasi,
korespondensi, rekonstruksi objek

vi

ABSTRACT

Name
Faculty
Title

: Mohammad Agung Wibowo


: Computer Science
: 3D Surface Object Reconstruction with Passive Vision Approach

3D object reconstruction is still being an unresolved issue recently. So many


methods and researches are increasingly developed to optimize the output of 3D
reconstruction and to reduce the computational cost. There are several approches
that can be used to reconstruct the object in 3D. This research uses a passive
vision stereo approach. To reconstruct, this system uses stereo camera that has
been calibrated before. In rectification process, this system uses algorithm created
by Bouget to fit the horizontal line. Stereo correspondence phase empowers
block-matching stereo algorithm that uses SAD method to find the matching
features. Depth calculation are done by triangulation method based on disparity
information. This system runs under C++ language and uses OpenCV library. To
do visualization, this system uses Point Cloud Library (PCL).

Key words: Stereo computer vision, passive stereo vision, stereo calibration,
rectification, correspondence, object reconstruction.

vii

DAFTAR ISI

HALAMAN JUDUL................................................................................................ i
HALAMAN PERNYATAAN ORISINALITAS .................................................... ii
HALAMAN PENGESAHAN ................................................................................ iii
KATA PENGANTAR ........................................................................................... iv
HALAMAN PERNYATAAN PERSETUJUAN PUBLIKASI .............................. v
ABSTRAK ............................................................................................................. vi
ABSTRACT .......................................................................................................... vii
DAFTAR ISI ........................................................................................................ viii
DAFTAR GAMBAR ............................................................................................. xi
DAFTAR TABEL ................................................................................................ xiii
DAFTAR LAMPIRAN ........................................................................................ xiv
BAB 1 PENDAHULUAN ...................................................................................... 1
1.1 Latar Belakang .............................................................................................. 1
1.2 Rumusan Masalah ......................................................................................... 2
1.3 Kontribusi Penelitian..................................................................................... 2
1.4 Ruang Lingkup Penelitian ............................................................................. 2
1.5 Tujuan Penelitian .......................................................................................... 3
1.6 Metode Penelitian.......................................................................................... 3
1.7 Sistematika Penulisan .................................................................................. 4
BAB 2 LANDASAN TEORI .................................................................................. 5
2.1 Visi Komputer ............................................................................................... 5
2.2 Pengenalan Pola ............................................................................................ 6
2.3 Pengolahan Citra .......................................................................................... 7

viii

2.3.1 Konversi Grayscale ............................................................................... 9


2.3.2 Perataan Histogram ............................................................................. 10
2.4 Visi Komputer Stereo................................................................................. 12
2.5 Pencitraan Stereo ........................................................................................ 13
2.6 Kamera ....................................................................................................... 14
2.6.1 Unsur Interinsik Kamera ..................................................................... 15
2.6.2 Distorsi Lensa ..................................................................................... 16
2.7 Kalibrasi Kamera ....................................................................................... 18
2.7.1 Matriks Rotasi, Vektor Translasi ........................................................ 18
2.7.2 Homografi ........................................................................................... 18
2.7.3 Proses Kalibrasi Kamera ...................................................................... 19
2.8 Kalibrasi Kamera Stereo ............................................................................ 22
2.9 Rektifikasi/Perbaikan Stereo ...................................................................... 23
2.10 Korespondensi Stereo............................................................................... 26
2.11 Bidang Epipolar dan Garis Epipolar ........................................................ 30
2.12 Triangulasi dan Pengukuran Kedalaman ................................................. 30
2.13 Rekonstruksi 3D ....................................................................................... 31
BAB 3 PERANCANGAN DAN IMPLEMENTASI ............................................ 33
3.1

Perancangan ............................................................................................ 33

3.1.1 Perancangan Umum ............................................................................ 33


3.1.3 Perancangan Rekonstruksi 3D ............................................................ 37
3.1.4 Kamera ................................................................................................ 38
3.1.5 Data ..................................................................................................... 39
3.2 Implementasi .............................................................................................. 42

ix

3.2.1 Program Utama ................................................................................... 42


3.2.2 Masukan .............................................................................................. 43
3.2.3 Kalibrasi Kamera Stereo ..................................................................... 45
3.2.4 Rekonstruksi 3D .................................................................................. 51
3.2.5 Perhitungan Error ............................................................................... 52
BAB 4 HASIL EKSPERIMEN DAN ANALISIS ................................................ 55
4.1 Rancangan Eksperimen ............................................................................... 55
4.1.1 Parameter Eksperimen ......................................................................... 55
4.1.2 Variabel Eksperimen ............................................................................ 55
4.1.3 Batasan Eksperimen ............................................................................ 56
4.2 Eksperimen.................................................................................................. 57
4.3 Hasil Eksperimen Pertama .......................................................................... 57
4.4 Hasil Eksperimen Kedua ............................................................................ 60
BAB 5 PENUTUP ................................................................................................ 69
5.1 Kesimpulan ................................................................................................. 69
5.2 Kendala ....................................................................................................... 70
5.3 Saran ............................................................................................................ 71
DAFTAR PUSTAKA ........................................................................................... 72

DAFTAR GAMBAR

Gambar 2.1 Diagram Hubungan antara Visi Komputer, Pengenalan Pola, dan
Pengolahan Citra ................................................................................6
Gambar 2.2 Konversi Citra RGB ke Citra Grayscale ........................................... 10
Gambar 2.3 Histogram pada Citra dengan Berbagai Tingkat Kecerahan ............. 11
Gambar 2.4 Bayangan Objek pada Image Plane Kamera..................................... 15
Gambar 2.5 Bayangan Objek pada Image Plane Kamera Setelah Posisi Image
Plane dan Pinhole Plane Ditukar .....................................................15
Gambar 2.6 Distorsi Radial yang Terjadi Pada Objek Berbentuk Persegi ........... 17
Gambar 2.7 Fase-fase Rektifikasi Stereo .............................................................. 26
Gambar 2.8 Ilustrasi block-matching stereo algorithm......................................... 28
Gambar 2.9 Triangulasi ......................................................................................... 31
Gambar 3.1 Alur Program Utama Sistem ............................................................. 33
Gambar 3.2 Alur Proses Kalibrasi Kamera Stereo ............................................... 34
Gambar 3.3 Flow Chart Koleksi Citra Stereo ....................................................... 35
Gambar 3.4 Flow Chart Proses Kalibrasi Kamera Stereo .................................... 36
Gambar 3.5 Fase-fase Korespondensi Stereo........................................................ 37
Gambar 3.6 Alur Rekonstruksi 3D Objek ............................................................. 38
Gambar 3.7 Output Fungsi tampilkanStereo......................................................... 44
Gambar 3.8 Sudut-sudut Internal Papan Catur yang Berhasil Terdeteksi ............ 46
Gambar 3.9 Citra Sebelum Remapping (kiri) dan Sesudah Remapping (kanan) ...46
Gambar 3.10 Garis Epipolar dan Bidang Epipolar ............................................... 53
Gambar 4.1 Grafik Hubungan Jarak Kamera Stereo dengan Nilai Error ............. 59
Gambar 4.2 Grafik Hubungan Jumlah Citra Objek Kalibrasi dengan Nilai
Error .................................................................................................59
xi

Gambar 4.3 (a) Citra Stereo Dapur Rumah (b) Citra Disparity Dapur Rumah .... 61
Gambar 4.4 Citra Stereo Cones............................................................................. 62
Gambar 4.5 (a) Citra Disparity Cones 1 (b) Citra Disparity Cones 2 (c) Citra
Disparity Cones 3 .............................................................................63
Gambar 4.6 (a) Citra Stereo Lemari Kayu (b) Citra Disparity Lemari Kayu ....... 65
Gambar 4.7 (a) Citra 3D Lemari Kayu: Tampak Depan (b) Citra 3D Lemari
Kayu: Tampak bawah

(c) Citra 3D Lemari Kayu: Tampak

Kanan (d) Citra 3D Lemari Kayu: Tampak Kiri .............................65


Gambar 4.8 Citra Stereo Jantung .......................................................................... 66
Gambar 4.9 Citra Disparity Jantung ..................................................................... 67
Gambar 4.10 (a) Citra 3D Jantung: Tampak Depan (Zoom-in) (b) Citra 3D
Jantung: Tampak Depan (Zoom-out) (c) Citra 3D Jantung:
Tampak Miring (d) Citra 3D Jantung: Tampak Kanan (e) Citra
3D Jantung: Tampak kiri (f) Citra 3D Jantung: Tampak
Belakang ...........................................................................................68

xii

DAFTAR TABEL

Tabel 4.1 Nilai Error Kalibrasi Stereo .................................................................. 57


Tabel 4.2 Parameter-parameter BMState Dalam Citra Disparity Cones .............. 63

xiii

DAFTAR LAMPIRAN

LAMPIRAN 1. Kode Program Utama .................................................................. 74


LAMPIRAN 2. Beberapa Hasil Percobaan ......................................................... 106

xiv

BAB 1
PENDAHULUAN
Dalam bab ini akan dibahas mengenai latar belakang, rumusan masalah, tujuan,
ruang lingkup, dan metode penelitian yang dilakukan.
1.1 Latar Belakang
Perkembangan teknologi tiga dimensi akhir-akhir ini bisa dibilang sangat pesat.
Penggunaan dan pemanfaatannya sudah merambah ke berbagai bidang. Dalam
dunia entertainment, teknologi tiga dimensi seperti sudah menjadi bagian yang
melekat untuk menyajikan tampilan yang lebih menarik. Sudah banyak film-film
yang digarap dengan memanfaatkan teknologi ini, baik hanya sekedar untuk
membubuhi efek visual atau untuk membangun film secara keseluruhan.

Dalam dunia medis dan kedokteran, teknologi tiga dimensi juga semakin marak
digunakan. Para dokter dan tim medis sudah mulai memanfaatkan teknologi ini
dalam operasi jantung, misalnya, untuk membantu mereka mengetahui kondisi
jantung pasien secara lebih komprehensif. Dalam operasi plastik, penggunaan
teknologi ini juga semakin menjadi tren.

Dalam dunia komputer sendiri, teknologi tiga dimensi masih menjadi salah satu
topik yang hangat diperbincangkan. Dalam bidang robotic, teknologi tiga dimensi
masih terus dikembangkan untuk memberikan kemampuan binocular vision pada
robot agar dapat melihat selayaknya manusia melihat. Dalam bidang virtual
reality, teknologi tiga dimensi terus mengalami penyempurnaan agar ruang virtual
yang dihasilkan benar-benar menyerupai kondisi nyata. Salah satu contoh aplikasi
dalam bidang virtual reality yang memanfaatkan teknologi tiga dimensi adalah
simulai penerbangan.

Untuk menghasilkan citra tiga dimensi dari sebuah objek, dibutuhkan kamera
khusus. Kamera tersebut biasanya dilengkapi dengan peralatan khusus untuk
mengukur kedalaman objek. Namun, permasalahannya adalah harga dari kamera

Universitas Indonesia

G
a

khusus tersebut tergolong cukup tinggi. Di sisi lain, hadirnya metode visi stereo
pasif memungkinkan untuk dilakukannya proses rekonstruksi 3D objek dengan
hanya menggunakan kamera biasa yang telah melalui proses kalibrasi. Hal itu
tentunya membuka peluang untuk membuat citra tiga dimensi dari sebuah objek
dengan menggunakan kamera biasa dengan harga yang relatif cukup murah.
Dalam penelitian ini, penulis berkeinginan untuk membangun sistem yang bisa
merekonstruksi sebuah objek secara tiga dimensi dengan menggunakan kamera
biasa.
1.2 Rumusan Masalah
Berdasarkan hal-hal yang telah disebutkan dibagian sebelumnya, penulis
merumuskan beberapa pokok masalah yang akan diteliti, yaitu:

Bagaimana melakukan rekonstruksi 3D dari suatu objek dengan


menggunakan kamera biasa?

Bagaimana mengukur besar kedalaman suatu objek pada citra agar bisa
didapat representasi 3D-nya?

Apa yang harus dilakukan pada kamera untuk dapat merekonstruksi 3D


suatu objek?

Tahapan apa yang harus dilakukan untuk dapat melakukan rekonstruksi


3D suatu objek?

Bagaimana memvisualisasikan objek 3D yang ditelah direkonstruksi?

1.3 Kontribusi Penelitian


Penelitian ini dilakukan dengan harapan dapat memberikan kontribusi yang
signifikan terhadap perkembangan teknologi rekonstruksi 3D suatu objek yang
murah.
1.4 Ruang Lingkup Penelitian
Penelitian ini dilakukan dalam ruang lingkup sebagai berikut:

Sistem dibuat dalam bahasa pemrograman C++.

Sistem diimplementasikan dengan menggunakan library OpenCV.

Untuk melakukan visualisasi, akan digunakan Point Cloud Library (PCL).

Sistem di-build dengan build system CMake.


Universitas Indonesia

Input sistem adalah data dari kamera stereo.

Objek akan direkonstruksi secara tiga dimensi dari satu sisi saja.

Penempatan kamera kiri dan kamera kanan harus bersifat horizontal.

Ruang pengamatan memiliki pencahayaan yang memadai.

1.5 Tujuan Penelitian


Tujuan dari penelitian ini adalah untuk mewujudkan harapan lahirnya sistem yang
bisa melakukan rekonstruksi 3D dari objek nyata dengan menggunakan dua
kamera biasa.
1.6 Metode Penelitian
1. Studi literatur
Sebelum memulai penelitian, penulis melakukan studi literatur dari berbagai
sumber, antara lain, buku, jurnal, tutorial, website, dll . Penulis juga melakukan
beberapa percobaan dengan menggunakan library OpenCV dari beberapa tutorial
yang terkait dengan sistem yang akan dibangun.
2. Desain Proses
Setelah melakukan studi literatur, penulis membuat desain garis besar sistem yang
akan dikembangkan. Desain tersebut mencakup pembacaan input, penyimpanan
parameter, tahapan preprocessing, algoritma yang digunakan, alur program
utama, visualisasi, skema testing, perhitungan error, hingga output yang diberikan
program.
3. Implementasi
Setelah desain proses rampung dibuat, penulis melakukan tahapan implementasi.
Dalam tahapan ini, penulis mulai mengembangkan sistem berdasarkan skema
yang telah dibuat.
4. Eksperimen dan Analisis
Setelah membuat sistem, penulis akan melakukan eksperimen. Eksperimen
dilakukan dengan menggunakan skema testing yang telah dibuat dibagian desain
proses. Setelah melakukan eksperimen, penulis akan melakukan analisis dari data
yang diperoleh.

Universitas Indonesia

1.7 Sistematika Penulisan


Secara garis besar, skripsi ini terbagi menjadi lima bagian, yaitu:

BAB 1 PENDAHULUAN
Bab ini diawali dari pemaparan tentang latar belakang pembuatan skripsi.
Kemudian, dijelaskan tentang perumusan masalah, kontribusi yang diharapkan,
tujuan penelitian, ruang lingkup penelitian, dan metode penelitian. Selain itu, bab
ini juga menjelaskan tentang sistematika penulisan skripsi secara keseluruhan.

BAB 2 LANDASAN TEORI


Bab ini menjelaskan tentang teori-teori yang digunakan dalam penelitian yang
mencakup pembahasan tentang algoritma yang digunakan serta pemaparan istilahistilah khusus dalam skripsi ini.

BAB 3 PERANCANGAN DAN IMPLEMENTASI


Bab ini bercerita tentang gambaran rancangan sistem dan implementasinya. Bab
ini juga akan menjelaskan perangkat dan data yang akan digunakan sistem.

BAB 4 HASIL EKSPERIMEN DAN ANALISIS


Bagian ini memaparkan tentang hasil dari eksperimen yang dilakukan terhadap
sistem. Selain itu, akan juga dijelaskan tentang analisis penulis terhadap hasil
tersebut. Dalam melakukan analisis, penulis akan menggunakan kerangka teori
yang ada dalam bab landasan teori.

BAB 5 PENUTUP
Bab ini merupakan bagian terakhir dari skripsi. Isi dari bab ini adalah kesimpulan,
kendala, dan saran dari penelitian ini.

Universitas Indonesia

BAB 2
LANDASAN TEORI
Bab ini memaparkan tentang teori-teori yang menjadi landasan penulis dalam
melakukan penelitian.
2.1 Visi Komputer
Visi komputer adalah ilmu yang fokus membahas tentang kapabilitas komputer
untuk menerima, memroses, menganalisis, dan menyimpulkan masukan berupa
citra. Tujuan dari ilmu ini ialah menjadikan mesin agar bisa membuat keputusan
rasional dan mengambil tindakan atau setidaknya membentuk kesimpulan
berdasarkan masukan data visual yang diterima [14]. Ballard dan Brown (1982)
berpendapat bahwa visi komputer adalah ilmu yang membahas tentang konstruksi
deskripsi eksplisit yang memiliki makna terkait dengan objek visual dari dunia
nyata. Sedangkan, Trucco dan Verri (1998) menyimpulkan bahwa bahasan dari
visi komputer adalah tentang proses komputasi properti-properti visual tiga
dimensi pada dunia nyata. Sebagai cabang ilmu, visi komputer tidak berdiri
sendiri. Ada disiplin ilmu lain yang juga menggali hal beririsan dengan visi
komputer, yaitu pengolahan citra dan pengenalan pola. Ilustrasi dari dari
hubungan ketiga disiplin ilmu tersebut dapat dilihat pada Gambar 2.1.

Membuat komputer bisa melihat, memahami, dan memberikan kesimpulan yang


tepat bukanlah hal yang mudah. Hal tersebut karena komputer melihat citra
dengan cara yang berbeda dengan manusia. Seindah apapun citra yang di-input,
komputer hanya melihat citra tersebut sebagai tumpukan kode-kode biner yang
tersekat-sekat dalam matriks dua dimensi. Jangankan untuk menceritakan kondisi
keseluruhan citra, untuk memahami bagian kecilnya saja sudah merupakan
pekerjaan yang sangat sulit. Ketika seorang guru melihat siswanya menengok ke
belakang saat ujian berlangsung, guru tersebut dapat dengan mudah mengatakan
bahwa siswanya menyontek dan siswa tersebut dapat langsung diberi hukuman.
Namun, jika kita ingin menyerahkan tugas pengawasan itu ke komputer,
prosesnya tidak akan semudah itu. Citra yang didapat dari kamera harus

Universitas Indonesia

G
a

diekstraksi dan ditransformasi sedemikian rupa sehingga bisa dihasilkan


kesimpulan siswa mencontek atau kesimpulan lainnya. Hal tersebut dipersulit
lagi dengan kondisi citra yang hanya terbatas pada ruang dua dimensi. Kondisi
tersebut tentunya mempersulit penggalian informasi dari objek tertentu dalam
citra tersebut, karena, objek tersebut sebenarnya berada pada lingkup tiga dimensi.
Sedangkan, untuk mengubah citra menjadi berdimensi tiga bukanlah hal yang
mudah. Sama kasusnya dengan penyelesaian persamaan linear dari dua persamaan
dan tiga variabel, under-determined, akan ada tak hingga banyak solusi yang
mungkin terbentuk. Untuk mengubah citra yang hanya dua dimensi tersebut ke
dalam bentuk tiga dimensi akan sangat sulit. Hal tersebut karena setiap citra dua
dimensi dapat merepresentasikan tak hingga banyak kombinasi citra tiga dimensi.
Hal tersebut diperparah lagi dengan kenyataan bahwa citra yang di-input tidak
mungkin terbebas dari distorsi.

Gambar 2.1 Diagram Hubungan antara Visi Komputer, Pengenalan Pola, dan Pengolahan
Citra

2.2 Pengenalan Pola


Pengenalan pola adalah cabang ilmu yang bertujuan untuk melakukan klasifikasi
pola suatu objek yang bisa dikenali atau diidentifikasi (image, sidik jari, DNA,
suara, dll) ke dalam suatu ketegori atau kelas tertentu. Ilmu ini merupakan ilmu

Universitas Indonesia

yang lahir dari rahim ilmu statistik. Namun sekarang, pengenalan pola merupakan
subtopik dari bahasan machine learning.
Konsep pengenalan pola yang diaplikasikan di dunia komputer, sebenarnya,
meng-imitasi cara manusia dalam mengenali pola. Lindsay [10] mengatakan,
dalam bukunya yang berjudul An Introduction to Psychology bahwa manusia
memiliki metode yang unik dalam melakukan pengenalan mengenali pola, yaitu,
dengan menggunakan fitur analisis yang dimisalkan sebagai serangkaian hantu
yang ditugaskan untuk mengenali pola-pola yang diterima. Setiap hantu memiliki
metode sendiri yang berbeda dari hantu-hantu lain dalam hal mengenali pola. Jika
salah satu hantu bisa mengenali pola yang diberikan, maka hantu tersebut akan
berteriak. Semakin banyak hantu yang berteriak maka prosentase objek tersebut
dikenali akan semakin tinggi.
Pengenalan pola pada manusia merupakan misteri yang sangat besar. Karena itu,
Lindsay memisalkan fitur analisis pengenal pola dengan sebutan hantu. Dalam
machine learning, prinsip kerja pengenalan pola hampir serupa dengan itu. Objek
tertentu yang ingin dikenali akan dianalisis fitur-fiturnya dan ditemukan polanya.
Kemudian, pola itu akan dicoba untuk dikenali dengan cara mengklasifikasinya
berdasarkan hasil pembelajaran mesin sebelumnya tentang pola-pola objek.
Seiring berkembangnya teknologi, kebutuhan akan aplikasi praktis pengenalan
pola semakin meningkat. Sejauh ini sudah ada beberapa teknologi yang
dikembangkan dari ilmu pengenalan pola, yaitu: face detection, face recognition,
spech recognition, DNA recognition, dll.
2.3 Pengolahan Citra
Pengolahan citra adalah cabang ilmu yang membahas tentang bagaimana
mengubah suatu citra tertentu menjadi citra bentuk lain. Tujuan dari pengubahan
tersebut bisa bermacam-macam, salah satunya adalah untuk memperbaiki kualitas
gambar. Dalam visi komputer, metode pengolahan citra sering digunakan pada
fase preprocessing.

Universitas Indonesia

Aplikasi berbasis pengolahan citra pertamakali diperkenalkan pada tahun 1920 di


New York. Aplikasi tersebut digunakan oleh industri media cetak ketika ingin
mengirim suatu citra dari kota London ke New York. Saat itu digunakan kabel
Bartlane yang dibentangkan melintasi samudra Atlantis. Saat sampai di New
York, citra tersebut kemudian direkonstruksi kembali dan dibersihkan dari noise
yang menempel saat diperjalanan. Untuk melakukan pembersihan dan
rekonstruksi tersebut, digunakan teknik pengolahan citra. Dengan cara itu,
perusahaan tersebut berhasil memangkas waktu pengiriman yang biasanya kurang
lebih satu minggu menjadi tidak lebih dari tiga jam.

Pada tahun 1960-an, perkembangan yang cukup signifikan di bidang ini terjadi.
Hal tersebut dikarenakan, pada masa itu, teknologi chip mulai digunakan sebagai
pengganti transistor. Chip dapat mengatasi masalah yang sebelumnya ada pada
pengolahan citra, yaitu, biaya komputasi yang mahal dan alokasi space yang
cukup besar. Aplikasi pengolahan citra yang cukup fenomenal pada masa itu ialah
perbaikan kualitas citra permukaan bulan yang didapat dari satelit Ranger 7. Pada
tahun 1970-an, teknologi pengolahan citra mulai merambah dunia kedokteran.
Saat itu, fitur berbasis pengolahan citra digunakan untuk melihat bagian dalam
kepala manusia dengan bantuan sinar X. Alat tersebut bernama Computerised
Axial Tomography (CAT) Scan.

Inti dari pengolahan citra ialah melakukan transformasi suatu citra. Transformasi
dilakukan dengan tujuan yang berbeda-beda, misalnya: memberi efek tertentu;
mempertajam bagian gambar tertentu; memperbesar atau memperkecil gambar;
menghilangkan bagian gambar tertentu; mencari edge; merestorasi gambar yang
rusak; dan lain-lain. Setiap tujuan yang ingin dicapai tentunya memiliki
spesifikasi tersendiri yang membutuhkan metode yang tidak selalu sama dengan
tujuan lainnya. Oleh karena itu, ada banyak sekali algoritma dan metode dalam
pengolahan citra. Salah satu yang lazim digunakan adalah konvolusi. Konvolusi
adalah penggabungan sinyal citra dengan sinyal lain (kernel) sedemikian rupa
sehingga didapat sinyal citra baru [6].

Universitas Indonesia

2.3.1 Konversi Grayscale


Grayscale merupakan salah satu tipe citra dalam komputer. Tipe citra ini bisa
dibilang sangat sederhana. Setiap piksel dari citra grayscale hanya membawa
informasi tunggal yang merepresentasikan nilai intensitas dari citra tersebut.
Umumnya, citra grayscale menyediakan 8-bit (1 byte) untuk menyimpan
informasi, sehingga, banyak variasi warna dari citra grayscale adalah 28 = 256
warna yang hanya terdiri dari tiga warna utama yaitu hitam, putih, dan variasi dari
warna abu-abu. Citra grayscale bisa dibentuk dengan dua cara, yaitu, secara
langsung dan tidak langsung. Pada pembentukan secara langsung, citra grayscale
dibuat dengan menangkap intensitas cahaya yang dipantulkan oleh objek tertentu
dan nilai intensitas tersebut langsung dikodekan kedalam tipe grayscale,
sedangkan, cara tidak langsung adalah dengan melakukan konversi citra berwarna.

Untuk melakukan konversi citra berwarna bertipe RGB menjadi citra grayscale,
dilakukan metode perhitungan rata-rata berbobot. Nilai intensitas keabuan citra
grayscale didapat dengan menghitung rata-rata dari nilai merah, hijau, dan biru
pada citra RPG dengan bobot tertentu. Bobot yang diberikan bisa jadi berbeda
untuk beberapa literatur, namun, yang penulis gunakan ialah pembobotan yang
dilakukan oleh OpenCV, yaitu: merah sebesar 0,299; hijau sebesar 0,587; dan biru
sebesar 0,114.

Citra bertipe grayscale merupakan citra yang sering digunakan pada proses
komputasi dalam visi komputer atau pengolahan citra. Hal tersebut dikarenakan
citra ini memiliki ukuran yang tidak terlalu besar dan hanya terdiri dari satu kanal.
Seperti telah disebutkan sebelumnya, proses komputasi citra merupakan proses
yang tergolong mahal. Oleh karena itu, penggunaan tipe warna yang sederhana
bisa menjadi solusi yang bijaksana.

Universitas Indonesia

10

Gambar 2.2 Konversi Citra RGB ke Citra Grayscale


Sumber: http://www.postflix.com

2.3.2 Perataan Histogram


Dalam

statistika,

histogram

identik

dengan

sajian

visual

data

yang

merepresentasikan frekuensi kemunculan data pada interval tertentu [16].


Umumnya, histogram digambarkan dalam bentuk diagram batang, dimana, tinggi
dari batang mengindikasikan frekuensi kemunculan data. Histogram dalam
pengolahan citra adalah representasi grafik dari frekuensi intensitas keabuan atau
nilai warna yang terdapat pada citra [5]. Histogram memetakan banyaknya piksel
dengan intensitas tertentu ke dalam nilai intensitas tersebut. Secara lebih spesifik,
histogram suatu citra digital dalam rentang intensitas keabuan [0, L-1] adalah
suatu fungsi diskrit h(rk) = nk, dengan rk menyatakan intensitas warna keabuan
ke-k, dan nk menyatakan frekuensi kemunculan piksel dengan intensitas warna
keabuan rk.

Universitas Indonesia

11

Gambar 2.3 Histogram pada Citra dengan Berbagai Tingkat Kecerahan


Sumber: Gonzalez, R.C., & Woods, R.E. (2007). Digital Image Processing. New Jersey: Prentice
Hall

Perataan histogram merupakan proses penggeseran dan pelebaran histogram pada


domain spasial. Tujuan dari proses ini adalah untuk memperbaiki kontras suatu
citra. Perbaikan dilakukan dengan cara mendistribusikan tingkat keabuan citra
secara merata ke setiap piksel. Tingkat keabuan tertentu yang memiliki frekuensi
tinggi akan dijarangkan dan tingkat keabuan tertentu yang memiliki frekuensi
rendah akan dirapatkan dengan nilai sebelumnya. Proses perataan histogram
membuat setiap derajat keabuan tertentu memiliki jumlah piksel yang relatif
setara atau tidak berbeda terlalu jauh.

Untuk melakukan perataan histogram dalam rentang gradasi keabuan [0, L-1],
dilakukan transformasi, T, pada piksel rk, sehingga menjadi warna baru sk.
Formulanya adalah sebagai berikut:

Universitas Indonesia

12

(2.1)

Dalam visi komputer, perataan histogram dibutuhkan pada fase preprocessing.


Citra yang didapat dari kamera bisa jadi memiliki kontras yang tidak standar
akibat pencahayaan ekstrim yang terjadi dilapangan.
2.4 Visi Komputer Stereo
Visi komputer stereo merupakan perluasan dari visi komputer, dimana,
penggunaan kamera sebagai alat input citra ditambah menjadi dua. Tujuan yang
ingin digali dari visi komputer stereo adalah meningkatkan daya pengamatan
terhadap citra. Seperti diketahui, bahwasanya, citra merepresentasikan gambar
hanya dalam ruang dua dimensi. Hal tersebut menimbulkan masalah yang cukup
berarti dalam visi komputer, karena, objek pengamatan sesungguhnya berada
dalam ruang tiga dimensi.

Konsep visi komputer stereo, sebenarnya, mengimitasi kemampuan manusia


dalam melihat. Manusia melihat objek menggunakan dua mata yang digunakan
secara bersama, yang disebut dengan binocular vision. Kemampuan tersebut
membuat manusia bisa melihat objek secara lebih komprehensif karena bisa
memberikan persepsi tentang unsur kedalaman [3]. Dalam visi komputer,
penggunaan kamera yang stereo, salah satunya, ditujukan untuk mendapatkan
kemampuan tersebut.

Prinsip kerja visi komputer stereo untuk menghitung unsur kedalaman objek
adalah dengan membandingkan perbedaan citra yang dihasilkan dari kamera
sebelah kiri dan kamera sebelah kanan yang sudah diletakkan secara horizontal
dalam jarak tertentu yang diketahui. Banyak hal yang bisa dilakukan terhadap
objek dalam citra yang bisa diketahui informasi kedalamannya, salah satunya
adalah rekonstruksi objek tersebut dalam bentuk tiga dimensi.

Universitas Indonesia

13

Secara garis besar, visi komputer stereo diklasifikasi menjadi dua bagian, yaitu,
visi komputer stereo aktif dan visi komputer stereo pasif. Visi komputer stereo
aktif merupakan visi komputer yang secara aktif menggunakan sinar tertentu
(biasanya sinar laser) untuk mempermudah proses penyesuaian citra dari kamera
sebelah kanan dan kamera sebelah kiri. Dengan sinar bantuan tersebut, proses
perhitungan kedalaman objek bisa lebih terbantu. Sedangkan, visi komputer stereo
pasif tidak menggunakan bantuan apapun dalam proses penyesuian citra.
Penelitian kali ini menggunakan metode visi komputer stereo pasif.
2.5 Pencitraan Stereo
Pencitraan stereo adalah pencitraan dengan menggunakan dua sudut pandang.
Perbedaan sudut pandang tersebut kemudian disatukan menjadi satu citra yang
komprehensif. Penyatuan dilakukan dengan cara menyocokkan titik-titik yang
bersesuaian antara satu citra dengan citra lainnya [1]. Dengan pencitraan stereo,
suatu titik dalam citra bisa di perkirakan letak lokasi 3D-nya relatif terhadap
kamera. Secara garis besar, langkah-langkah melakukan pencitraan stereo dengan
dua kamera adalah sebagai berkut:
Undistortion, yaitu penghilangan distorsi yang ada pada citra. Keluaran
dari proses ini adalah citra yang sudah bersih dari distorsi.
Rectification, yaitu proses penyesuaian terhadap sudut dan jarak antara
kedua kamera. Hasil dari proses ini adalah dua citra dengan baris yang
sudah serasi.
Correspondence, yaitu proses menemukan fitur yang sama antara citra
yang dihasilkan dari kamera sebelah kiri dengan citra yang dihasilkan dari
kamera sebelah kanan. Hasil dari proses ini adalah disparity map.
Reprojection, yaitu melakukan proyeksi dengan metode triangulasi
terhadap disparity map sehingga bisa didapatkan nilai kedalaman. Produk
dari proses ini ialah peta kedalaman.

Universitas Indonesia

14

2.6 Kamera
Suatu objek bisa terlihat oleh mata karena mata menangkap sinar yang dipantulan
oleh objek tersebut. Sinar datang melewati lensa mata dan kemudian ditangkap
oleh retina mata. Prinsip kerja kamera hampir serupa dengan itu. Untuk
menangkap sinar yang dipantulkan objek, kamera menggunakan alat bernama
pinhole. Pinhole dapat diandaikan seperti dinding imajiner yang memiliki lubang
kecil ditengah. Tugas dari pinhole adalah untuk menghadang semua sinar yang
datang kecuali sinar yang datang melalui lubang kecil tersebut.

Walaupun pinhole dapat menangkap sinar, pinhole kurang baik dalam membentuk
citra. Hal tersebut dikarenakan pinhole tidak memiliki kemampuan untuk
mengumpulkan sinar dalam jumlah yang cukup banyak, terutama pada
pencahayaan yang cepat. Oleh karena itu, untuk melengkapi pinhole, kamera
membutuhkan lensa. Tugas dari lensa kamera adalah untuk membantu pinhole
mengumpulkan cahaya.

Jika ada suatu benda setinggi X, diletakkan pada jarak Z dari pinhole, maka benda
tersebut akan di proyeksikan ke sebuah bidang bernama image plane. Jika jarak
antara image plane dengan pinhole (kedepannya disebut dengan panjang titik api)
disimbolkan dengan f dan bayangan yang terbentuk memiliki tinggi x, maka
rumusan untuk mencari x adalah sebagai berikut:

(2.2)

Nilai negatif yang menyertai x menandakan bahwa bayangan yang terbentuk


bersifat terbalik dari objek aslinya. Ilustrasinya adalah sebagai berikut:

Universitas Indonesia

15

Gambar 2.4 Bayangan Objek pada Image Plane Kamera


Sumber: Bradski, G., & Kaehler, A. (2008). Learning OpenCV Computer Vision with the
OpenCV Library. OReilly Media

2.6.1 Unsur Interinsik Kamera


Untuk mempermudah proses perhitungan matematika, skenario pinhole yang
digambarkan diatas disusun agak berbeda, yaitu, dengan menukar posisi image
plane dan pinhole, sehingga, image plane berada diantara objek dan pinhole.
Sebuah titik dalam pinhole kemudian menjadi pusat proyeksi yang idealnya
terletak pada sumbu optik (optical axis). Sumbu optik merupakan sumbu utama
proyeksi yang bersifat ortogonal terhadap image plane. Ilustrasinya tertera pada
Gambar 2.5.

Gambar 2.5 Bayangan Objek pada Image Plane Kamera Setelah Posisi Image Plane dan
Pinhole Plane Ditukar
Sumber: Bradski, G., & Kaehler, A. (2008). Learning OpenCV Computer Vision with the
OpenCV Library. OReilly Media

Universitas Indonesia

16

Telah disebutkan diatas bahwa idealnya pusat proyeksi berada tepat pada sumbu
optik. Namun, tidak ada pinhole ideal yang bekerja secara sempurna. Selalu ada
pergeseran pusat proyeksi sehingga ia tidak persis berada pada sumbu optik.
Kondisi tersebut menyebabkan posisi bayangan yang terbentuk juga akan selalu
mengalami pergeseran. Jika pergeseran yang terjadi pada sumbu-x sejauh cx dan
pergeseran pada sumbu-y sejauh cy, maka dengan mengadopsi persamaan (2.2),
kita bisa menghitung posisi bayangan yang terbentuk, yaitu:

( )
( )
(2.3)

Di persamaan (2.3), terlihat bahwa tanda negatif yang sebelumnya ada pada
persamaan (2.2) hilang. Hal tersebut dikarenakan, pada saat posisi pinhole dan
image plane ditukar, bayangan yang terbentuk tidak lagi berada dibawah sumbu
optik, sehingga, sifat bayangan tidak lagi terbalik. Koefisien fx dan fy
merepresentasikan panjang titik api kamera pada sumbu-x dan sumbu-y.

Unsur interinsik kamera adalah nilai-nilai fx, fy, cx, dan cy dari suatu kamera.
Untuk mendapatkan nilai tersebut, dilakukan proses kalibrasi kamera. Proses
tersebut akan dijelaskan pada bagian selanjutnya.

2.6.2 Distorsi Lensa


Tidak ada lensa yang bisa menangkap citra secara sempurna. Setiap lensa yang
digunakan kamera pasti memiliki distorsi yang sedikit banyak mengubah bentuk
citra. Ada dua distorsi yang mungkin terjadi, yaitu, distorsi radial dan distorsi
tangensial. Distorsi radial merupakan distorsi yang terjadi akibat bentuk dari lensa
kamera, sedangkan, distorsi tangensial merupakan distorsi yang disebabkan oleh

Universitas Indonesia

17

kesalahan pada tahap perakitan kamera yang tidak menempatkan lensa berada
persis paralel terhadap image plane.

Gambar 2.6 Distorsi Radial yang Terjadi Pada Objek Berbentuk Persegi
Sumber: Bradski, G., & Kaehler, A. (2008). Learning OpenCV Computer Vision with the
OpenCV Library. OReilly Media

Distorsi radial pada citra dapat dihilangkan jika kita mengetahui koefisien distorsi
radial k1, k2, dan k3. Perbaikan dapat dilakukan dengan rumus berikut:

(2.4)

Sama halnya dengan distorsi radial, distorsi tangensial pada citra juga bisa
dihilangkan jika kita mengetahui koefisien distorsi tangensial, yaitu, p1 dan p2.
Rumusan untuk menghilangkan distorsi tangensial adalah sebagai berikut:

(2.5)

Dalam OpenCV, koefisien distorsi radial (k1, k2, dan k3) dan koefisien distorsi
tangensial (p1, dan p2) disatukan dalam vektor bernama distortion vector. Untuk
mencari nilai-nilai dari koefisien tersebut, dilakukan proses kalibrasi kamera yang
akan dijelaskan pada bagian selanjutnya.

Universitas Indonesia

18

2.7 Kalibrasi Kamera


Kalibrasi kamera adalah suatu metode untuk mencari ukuran internal kamera yang
mempengaruhi proses pencitraan [17]. Ukuran internal kamera yang dimaksud
adalah unsur interinsik kamera (fx, fy, cx, dan cy) dan koefisien-koefisien distorsi
kamera (k1, k2, k3, p1, dan p2). Untuk mencari ukuran-ukuran tersebut, proses
kalibrasi membutuhkan sampel citra yang dihasilkan oleh kamera untuk dijadikan
sebagai parameter. Sebelum membahas bagaimana proses kalibrasi kamera, akan
diperkenalkan terlebih dahulu dengan matriks rotasi, vektor translasi, dan
homografi kamera.
2.7.1 Matriks Rotasi, Vektor Translasi
Objek yang terdapat dalam suatu citra memiliki pose tertentu relatif terhadap
sistem koordinat kamera. Pose tersebut dihasilkan dari proses transformasi
geometri objek asli, yaitu, dengan cara rotasi (perputaran objek dengan sudut
tertentu dan dari pusat tertentu) dan translasi (pergeseran objek). Perubahan secara
rotasi bisa didapat dengan cara melakukan perkalian dengan matriks yang
bernama matriks rotasi, dan perubahan secara translasi bisa dihitung dengan
melakukan pengurangan dengan vektor translasi. Jika objek asli dimisalkan
dengan Pc, pose objek dalam citra dimisalkan dengan Po, matriks rotasi dan vektor
translasi masing masing dimisalkan dengan R dan T, proses pencarian pose objek
dalam sistem koordinat kamera dapat dihitung dengan persamaan:

(2.6)
2.7.2 Homografi
Dalam visi komputer, dikenal istilah homografi, yaitu, pemetaan proyektif suatu
objek dari suatu bidang ke bidang lain. Dalam kamera, homografi yang dimaksud
adalah pemetaan proyektif suatu objek dari dunia riil ke image plane. Informasi
homografi kamera dibutuhkan dalam proses kalibrasi sebagai langkah awal untuk
menemukan ukuran-ukuran internal kamera. Homografi kamera, H, dapat dicari
dengan menyelesaikan persamaan berikut:

Universitas Indonesia

19

(2.7)

dengan Q merupakan koordinat objek dalam dunia riil, q adalah koordinat


bayangan dalam sistem koordinat kamera, dan s merupakan faktor skala.
2.7.3 Proses Kalibrasi Kamera
Setelah mengetahui homografi kamera beserta matriks rotasi dan vektor
translasinya, proses kalibrasi kamera bisa dilakukan. Proses untuk mencari ukuran
internal kamera tersebut dimulai dari persamaan berikut:

(2.8)

dengan H adalah homografi kamera, s merupakan faktor skala, r1 dan r2 masingmasing merupakan matriks rotasi terhadap sumbu-x dan sumbu-y, t adalah vektor
translasi, dan M merupakan matriks 3x3 yang berisi informasi unsur interinsik
kamera, yaitu:

Berdasarkan persamaan (2.8), kita bisa membuat formula untuk matriks rotasi r1
dan r2, yaitu:

dan,

(2.9)

Universitas Indonesia

20

Vektor-vektor rotasi, r1 dan r2, adalah vektor-vektor satuan yang saling tegak
lurus. Kondisi tersebut membuat r1 dan r2 bersifat ortonormal satu sama lain. Sifat
ortonormal mejadikan nilai dari perkalian dot antara kedua vektor tersebut adalah
nol. Sehingga, bisa dibentuk persamaan:

(2.10)

Selanjutnya, kita akan mencoba melakukan substitusi persamaan (2.9) ke


persamaan (2.10). Substitusi dilakukan dengan mengabaikan faktor skala s karena
nilai tersebut tidak memberikan kontribusi apapun terhadap hasil akhir. Hasil
subsitusi dari kedua persamaan tersebut adalah sebagai berikut:

(2.11)

Untuk memudahkan perhitungan dan mempersingkat penulisan, matriks B akan


digunakan untuk menggantikan matriks [

pada persamaan (2.11).

Dengan mengetahui representasi matriks M yang telah disebutkan sebelumnya,


maka matriks B yang terbentuk adalah:

Dengan menggunakan matriks B, persamaan (2.11) dapat dipersingkat dan dibuat


lebih umum penulisannya menjadi:

Universitas Indonesia

21

(2.12)

Jika kita melakukan perkalian matriks

, maka akan terlihat bahwa

representasi hasil dari perkalian matriks tersebut bisa digantikan dengan perkalian
matriks v dan vektor b, sehingga dapat dibentuk persamaan:

] [

]
(2.13)

Jika persamaan (2.13) diatas dapat diselesaikan, maka elemen-elemen dari vektor
b akan diketahui. Dari vektor b tersebut, kita bisa menghitung nilai-nilai dari
unsur interinsik kamera. Rumusan untuk mencari nilai-nilai interinsik kamera
adalah sebagai berikut:

dengan

(2.14)

Universitas Indonesia

22

Setelah unsur interinsik dari kamera diketahui, langkah selanjutnya ialah mencari
koefisien distorsi. Distorsi adalah gangguan pada citra sehingga bentuk objek pada
citra tidak tergambar sebagaimana mestinya. Koefisien distorsi dapat dicari
dengan melakukan komparasi posisi titik yang terpetakan pada citra dengan posisi
titik semestinya. Dengan mengetahui nilai-nilai interinsik fx, fy, cx, dan cy, posisi
titik semestinya (xp, yp) pada citra bisa didapat dengan mengadopsi persamaan
(2.3), yaitu:

]
(2.15)

Selanjutnya, titik tersebut (xp, yp) dibandingkan dengan titik pada citra yang telah
terdistorsi (xd, yd). Persamaan untuk melakukan perbandingan tersebut adalah:

]
(2.16)

Dengan menyelesaikan persamaan nilai-nilai koefisien distorsi (k1, k2, k3, p1, dan
p2) bisa didapatkan. Namun, dibutuhkan beberapa kali komparasi titik agar
persamaan tersebut bisa diselesaikan.
2.8 Kalibrasi Kamera Stereo
Kalibrasi kamera stereo adalah proses untuk menghitung hubungan secara
geometri antara dua kamera [1]. Pada dasarnya, proses kalibrasi kamera stereo
sama dengan proses kalibrasi biasa. Perbedaannya hanya terletak pada
penggunaan matriks rotasi dan vektor translasinya. Pada kalibrasi kamera stereo,
digunakan dua kamera dengan sudut pandang yang berbeda. Perbedaan sudut
pandang itu tentunya membuat matriks rotasi dan vektor translasinya menjadi
tidak sama. Matriks rotasi dan vektor translasi yang berbeda tersebut harus
disatukan untuk kemudian digunakan dalam proses kalibrasi. Jika dimisalkan Rl
Universitas Indonesia

23

dan Tl masing-masing adalah matriks rotasi dan vektor translasi dari kamera
sebelah kiri, dan Rr dan Tr masing-masing adalah matriks rotasi dan vektor
translasi dari kamera sebelah kanan, formula untuk menggabung kedua matriks
rotasi dan vektor translasi tersebut adalah:

(2.17)

(2.18)
2.9 Rektifikasi/Perbaikan Stereo
Penggabungan dua buah citra yang dihasilkan dari dua kamera yang berbeda
bukanlah hal yang mudah. Kedua buah citra hanya bisa digabungkan jika kedua
kamera yang digunakan bersifat koplanar, yaitu, image plane dari kedua kamera
terletak pada bidang yang sama. Namun, dalam dunia riil, kondisi itu sangat sulit
dicapai karena selalu saja ada faktor tertentu yang menyebabkan kamera berubah
posisi baik secara sengaja maupun tidak. Proses perbaikan stereo (stereo
rectification) bertujuan untuk menangani masalah tersebut.

Walaupun memposisikan kedua kamera agar bersifat koplanar dalam dunia nyata
adalah hal yang sangat sulit dan hampir mustahil, tidak begitu kondisinya di
lingkup virtual. Dalam perbaikan stereo, penyesuaiaan kedua kamera dilakukan
dengan memanipulasi proyeksi kedua kamera sehingga image plane dari kedua
kamera tersebut seolah-olah terletak pada bidang yang sama dan kedua kamera
tersebut seolah-olah bersifat koplanar. Ada beberapa cara untuk melakukan
perbaikan stereo dari dua kamera. Cara yang akan dijelaskan dan digunakan
dalam penelitian ini adalah dengan menggunakan algoritma Bouguet. Algoritma
Bouguet bekerja dengan memanfaatkan parameter rotasi dan translasi dari dua
buah kamera yang telah dikalibrasi sebelumnya.

Universitas Indonesia

24

Selain menangani masalah koplanaritas kedua kamera, dalam perbaikan stereo,


juga dilakukan proses penyerasian baris dari kedua kamera. Penyerasian baris ini
sangat penting untuk dilakukan karena akan mempermudah proses pada fase
selanjutnya yaitu korespondensi stereo. Algoritma Bouget menyerasikan baris
antara kamera sebelah kiri dan kamera sebelah kanan dengan menggunakan
matriks Rrect. Matriks tersebut melakukan penyerasian baris dengan merubah
sedemikian rupa matriks rotasi pada kedua kamera sehingga baris dari kedua
kamera dapat serasi. Matriks Rrect berisikian vektor e1, e2, dan e3, sebagai berikut:

]
(2.19)

Setelah matriks Rrect didapatkan, penyesuaian baris dilakukan dengan merubah


representasi dari matriks rotasi pada kamera sebelah kanan, rr, dan matriks rotasi
pada kamera sebelah kiri, rl, dengan persamaan sebagai berikut:

(2.20)

Setelah didapat representasi baru dari matriks rotasi kedua kamera, bisa dipastikan
setiap baris dari kedua kamera telah serasi. Selanjutnya, kita akan membuat
matriks proyeksi, P, yang berfungsi untuk memroyeksi ulang citra dari kedua

Universitas Indonesia

25

kamera sedemikian rupa sehingga image plane dari kedua kamera bersifat
koplanar. Untuk membuat matriks proyeksi, dibutuhkan matriks perbaikan Mrect
pada kamera sebelah kiri (Mrect_l) dan kamera sebelah kanan (Mrect_r) Matriks
proyeksi untuk kamera sebelah kiri dapat dibuat dengan persamaan:

][

]
(2.21)

Sedangkan, untuk kamera sebelah kanan, matriks proyeksinya adalah sebagai


berikut:

][

]
(2.22)

Nilai

dan

dalam matriks perbaikan M merepresentasikan faktor kemiringan

kamera masing-masing dari kamera sebelah kiri dan kamera sebelah kanan.
Namun, untuk kamera modern, faktor kemiringan tersebut bisa dikatakan hampir
tidak ada. Sehingga, nilai dari

dan

dalam kamera modern biasanya ialah nol

atau mendekati nol. Setelah matriks P didapatkan, kita bisa melakukan manipulasi
proyeksi sebuah objek dalam koordinat 3D ke koordinat 2D dengan persamaan:

[ ]

[ ]
(2.23)

Di dalam citra, posisi objek setelah diproyeksi akan terletak pada koordinat x/w
dan y/w. Ilustrasi dari proses perbaikan stereo adalah sebagai berikut:

Universitas Indonesia

26

Gambar 2.7 Fase-fase Rektifikasi Stereo


Sumber: Bradski, G., & Kaehler, A. (2008). Learning OpenCV Computer Vision with the
OpenCV Library. OReilly Media.

2.10 Korespondensi Stereo


Korespondensi stereo adalah proses untuk menyamakan koordinat 3D fitur-fitur
yang bersesuaian antara dua citra yang berasal dari kamera stereo [1]. Proses ini
bisa dikatakan sebagai langkah akhir dari proses penyatuan citra pada pencitraan
stereo. Korespondensi stereo hanya bisa dilakukan jika dua citra masukan
memiliki area yang beririsan. Dalam OpenCV, proses korespondesi stereo
dilakukan dengan mengimplementasi algoritma yang bernama block-matching
stereo algorithm yang dikembangkan oleh Kurt Konolige. Algoritma tersebut
menggunakan metode sum of absulute difference (SAD) untuk menemukan fiturfitur yang bersesuaian dari dua buah citra. Secara garis besar, block-matching
stereo algorithm terdiri dari tiga tahapan, yaitu:

1. Prefiltering
Block-matching stereo algorithm adalah algoritma yang sensitif terhadap
pencahayaan. Kondisi tersebut menyebabkan fitur yang sama pada dua buah citra
akan sulit terdeteksi jika kedua citra tersebut memiliki pencahayaan yang berbeda.
Selain itu, SAD yang digunakan dalam algoritma tersebut juga tidak akan bekerja
secara maksimal jika tekstur citra tidak begitu tinggi. Oleh karena itu, sebelum

Universitas Indonesia

27

dua buah citra dikorespondensi, agar hasilnya lebih maksimal, dilakukan fase
prefiletering. Fase ini bertujuan untuk melakukan normalisasi terhadap
pencahayaan pada citra agar perbedaan pencahayaan kedua citra tidak lagi begitu
besar. Selain itu, dalam fase ini, tekstur yang dimiliki oleh citra juga akan
dipertinggi secara maksimal.

2. Correspondence
Fase

ini

adalah

inti

dari

block-matching

stereo

algorithm,

yaitu,

mengkorespondensi fitur-fitur pada kamera sebelah kiri dengan fitur-fitur pada


kamera sebelah kanan sehingga fiturfitur yang bersesuaian tersebut bisa memiliki
posisi 3D yang sama. Namun, sebelumnya, perlu diingatkan kembali bahwa pada
tahap perbaikan stereo telah dilakukan penyesuaian baris pada kedua kamera.
Artinya, semestinya, fitur yang bersesuaian pada kedua kamera sudah berada pada
baris yang sama atau dengan kata lain sudah memiliki koordinat sumbu-y yang
sama. Kondisi baris yang telah bersesuaian tersebut tentunya mempermudah
proses korespondensi karena pencarian hanya tinggal dilakukan pada absisnya
saja. Sehingga, untuk mencari korespondensi titik (xo, yo) yang ada pada kamera
sebelah kiri ke titik tertentu pada kamera sebelah kanan, kita hanya tinggal
melakukan penggeseran posisi xo sejajar dengan sumbu-x sedemikian rupa
sehingga didapat posisi absis yang tepat pada kamera sebelah kanan. Sedangkan,
nilai ordinat yo sudah bisa dipastikan sama untuk kedua kamera.
Ilustrasi dari block-matching stereo algorithm bisa dilihat pada Gambar 2.8.

Universitas Indonesia

28

Gambar 2.8 Ilustrasi block-matching stereo algorithm


Sumber: Bradski, G., & Kaehler, A. (2008). Learning OpenCV Computer Vision with the
OpenCV Library. OReilly Media

Untuk mencari fitur yang bersesuaian dari kedua buah citra, block-matching
stereo algorithm mempekerjakan fungsi bernama matching function. Fungsi
tersebut mencari fitur yang bersesuaian dengan cara mencari nilai perbedaan
minimum berdasarkan horopter yang telah didefinisikan. Horopter (Num
Disparities) adalah satuan besaran blok dalam satu baris epipolar yang terdefinisi
berdasarkan nilai Min Disparity dan nilai Max Disparity. Untuk mencari nilai
perbedaan minimum, matching function menggunakan metode SAD. SAD
merupakan metode perhitungan sederhana yang biasa digunakan untuk
menemukan nilai perbedaan absolut dari dua buah informasi [1]. Jika dua buah
informasi memiliki nilai SAD yang besar, maka tingkat perbedaan dua buah
informasi tersebut tinggi, dan sebaliknya. Contoh sederhana dari perhitungan nilai
SAD adalah sebagai berikut:

Jika ada informasi A= [

] dan informasi B = [

], maka nilai SAD

dihitung dengan melakukan penjumlahan dari selisih kedua informasi tersebut,


yaitu:

Selisih dari informasi A dan informasi B adalah:

Universitas Indonesia

29

A-B = [

|
|

|
|

|
|

|
]=[
|

Nilai SAD-nya adalah 3+1+1+3 = 8.

Dengan menggunakan konsep SAD, kita bisa mencari korespondensi fitur pada
kamera sebelah kanan yang bersesuaian dengan (xo, yo) pada kamera sebelah kiri.
Dua fitur dikatakan bersesuaian jika memiliki nilai SAD nol atau setidaknya
mendekati nol. Seperti telah disebutkan sebelumnya, proses pencarian fitur yang
bersesuaian telah tereduksi menjadi pencarian absis saja karena ordinat telah
terkondisikan serasi pada proses sebelumnya. Sehingga, untuk mencari fitur pada
kamera sebelah kanan yang bersesuaian dengan (xo, yo), hanya perlu dilakukan
penggeseran (xo, yo) sejajar sumbu-x ke arah kiri pada kamera sebelah kanan.
Dalam setiap pergeseran, nilai SAD dari kedua fitur dicatat. Setelah penggeseran
selesai, nilai SAD dari seluruh posisi penggeseran dibandingakan dan dicari yang
paling minimum. Nilai SAD yang paling minimum itulah yang disinyalir
memiliki fitur yang sama dengan (xo, yo).
Walaupun block-matching stereo algorithm tergolong cukup cepat, namun,
algoritma ini hanya bisa bekerja secara efektif pada citra dengan tekstur tinggi.
Tekstur merupakan penekanan fitur dan detail pada citra. Tekstur yang tinggi bisa
didapat dengan mengkomposisikan ketajaman fokus kamera, pencahayaan yang
berkualitas, dan pengaturan kontras yang tepat. Jika fitur yang ingin
dikorespondensikan tidak memiliki tekstur yang tinggi, kemunginan besar,
metode SAD tidak akan tepat dalam menentukan fitur yang bersesuaian tersebut.

Untuk mencari unsur kedalaman, z, dilakukan metode bernama triangulasi.


Metode tersebut akan dijelaskan pada bagian selanjutnya.

3. Postfiletering
Seteleh titik yang berkoresponden antara dua buah kamera ditemukan, harus
dilakukan tahap pemastian lebih lanjut, yaitu postfiltering, yang bertujuan untuk
menghindari kesalahan dalam proses korespondensi. Kesalahan korespondensi
Universitas Indonesia

30

yang umum terjadi ialah karena tidak tingginya atau tidak memadainya tekstur
pada citra. Hal tersebut menyebabkan noise tidak bisa terdeteksi secara baik yang
menyebabkan algoritma SAD tidak begitu efektif bekerja. Untuk mengatasi
masalah tersebut, OpenCV menyediakan batasan dalam SAD window yang
bernama textureThreshold. Tugas utama dari textureThreshold adalah menyeleksi
hasil korespondensi berdasarkan kecukupan tingkat tekstur yang ada pada citra.
Sehingga, area pada citra yang memiliki tekstur tidak mencukupi bisa dieliminasi.
2.11 Bidang Epipolar dan Garis Epipolar
Saat suatu titik P ditangkap oleh image plane kamera kiri
proyeksi

dan image plane kamera kanan

dengan pusat

dengan pusat proyeksi

, titik

tersebut akan dibayangkan di pl pada image plane kamera kiri dan pr pada image
plane kamera kanan. Definisi dari bidang epipolar ialah bidang yang melewati
titik P,

, pl , dan pr. Sedangkan, garis epipolar adalah garis perpotongan

bidang epipolar dengan image plane

. Garis epipolar berada pada bidang

epipolar dan image plane dan harus dilalui oleh titik pl untuk garis epipor kamera
kiri dan titik pr untuk garis epipolar kamera kanan.
2.12 Triangulasi dan Pengukuran Kedalaman
Dalam trigonometri, triangulasi adalah metode untuk menemukan posisi suatu
titik dari dua titik lain dalam jarak dan sudut tertentu yang sudah diketahui.
Metode triangulasi sering dipakai untuk menghitung jarak kapal dari pesisir
pantai. Dalam pencitraan stereo, triangulasi digunakan untuk menghitung jarak
benda sesunguhnya relatif terhadap kamera. Jarak tersebut merupakan unsur
kedalaman, Z, dalam sistem koordinat riil benda relatif terhadap kamera. Metode
triangulasi bisa secara akurat menghitung jarak benda ke kamera jika sebelumnya
kedua kamera telah dikalibrasi secara stereo, distorsi kamera sudah dihilangkan,
dan sudah dilakukan tahapan korespondensi stereo[1].

Jika dimisalkan ada titik P yang ingin dihitung jaraknya, Z, terhadap dua kamera
yang terbentang sejauh T dengan panjang titik api f, rumusan untuk mencari Z bisa
didapat dengan menggunakan perhitungan perbandingan dua segitiga sebangun,
yaitu:
Universitas Indonesia

31

(2.24)

sehingga, bisa didapat:

(2.25)
Nilai xl dan xr menyatakan koordinat absis titik P dari sudut pandang kamera
sebelah kiri (xl) dan kamera sebelah kanan (xr). Selisih antara nilai xl dan nilai xr
disebut dengan nilai disparitas d yang bersifat berbanding terbalik dengan jarak, Z.
Ilustrasi dari metode triangulasi dalam pencitraan stereo adalah sebagai berikut:

Gambar 2.9 Triangulasi


Sumber: Bradski, G., & Kaehler, A. (2008). Learning OpenCV Computer Vision with the
OpenCV Library. OReilly Media

2.13 Rekonstruksi 3D
Rekonstruksi 3D dari sebuah objek merupakan proses membangun kembali
sebuah objek dalam citra ke bentuk aslinya. Untuk melakukan rekonstruksi sebuah
objek, dibutuhkan matriks Q dan citra disparity. Matriks Q merupakan salah satu
matriks parameter yang didapat dalam proses kalibrasi kamera stereo tepatnya

Universitas Indonesia

32

pada tahapan rektifikasi/perbaikan stereo. Representasi dari matriks Q adalah


sebagai berikut:

Dengan mengetahui matriks Q, posisi suatu objek relatif terhadap kamera bisa
diketahui.

Dalam proses rekonstruksi 3D, sistem koordinat objek mengalami perubahan dari
dua dimensi ke bentuk tiga dimensi. Secara teori, hal tersebut bisa dilakukan
dengan memanfaatkan konsep sistem koordinat homogen. Sistem koordinat
homogen adalah sistem koordinat yang mempunyai satu dimensi lebih tinggi dari
sistem koordinat yang ditinjau. Dengan memanfaatkan sistem koordinat homogen,
proses rekonstruksi bisa dimulai dari persamaan:

[ ]

[ ]
(2.26)

Dengan menyelesaikan persamaan (2.26), suatu titik (x,y) pada citra dengan nilai
disparity d, bisa didapatkan koordinat 3D-nya, yaitu:

(2.27)

Universitas Indonesia

33

BAB 3
PERANCANGAN DAN IMPLEMENTASI
Bab ini akan menjelaskan tentang perancangan dan implementasi sistem.
3.1 Perancangan
Bagian ini menjelaskan tentang perancangan sistem secara keseluruhan, mulai
dari perancangan umum sistem hingga ke bagian yang lebih detil.

3.1.1 Perancangan Umum


Untuk melakukan rekonstruksi 3D terhadap suatu objek dibutuhkan kamera
stereo. Kamera stereo akan menangkap objek dari dua sudut pandang yang
berbeda dan melakukan analisis untuk mendapatkan informasi kedalaman dari
objek tersebut relatif terhadap kamera. Agar kamera stereo dapat berfungsi dengan
baik dan melakukan perhitungan dengan tepat, harus dilakukan kalibrasi kamera
stereo. Sistem yang akan dibangun secara garis besar memiliki alur sebagai
berikut:

Kamera
Stereo

Ambil Citra Stereo

Kamera
Stereo

Kalibrasi Kamera Stereo

Rekonstruksi 3D

Output

Gambar 3.1 Alur Program Utama Sistem

Kalibrasi kamera stereo dilakukan dengan menggunakan objek kalibrasi berupa


papan catur. Alasan digunakannya alat tersebut sebagai objek kalibrasi adalah
karena geometrinya yang sederhana dan keberadaan sudut-sudutnya mudah
dideteksi oleh algoritma yang sudah disediakan oleh OpenCV. Kalibrasi kamera
stereo bisa dilakukan dengan lebih dari satu citra objek kalibrasi stereo. Semakin

33

Universitas Indonesia

34

banyak citra objek kalibrasi stereo yang digunakan, maka, semakin baik kualitas
parameter-parameter kamera yang didapatkan. Alur dari proses kalibarsi kamera
stereo adalah sebagai berikut:

Kamera
Stereo

Citra Stereo

Ambil Gambar

Simpan Gambar

Kalibrasi Stereo

Simpan Matriks Parameter

List Citra Stereo

Matriks
Parameter

Gambar 3.2 Alur Proses Kalibrasi Kamera Stereo

Sebelum kalibrasi kamera stereo dilakukan, ada fase koleksi citra objek kalibrasi
stereo. Fase tersebut ditujukan untuk mengumpulkan citra objek kalibrasi stereo
yang akan digunakan dalam proses kalibrasi kamera stereo. Dalam fase koleksi
citra objek kalibrasi stereo, sistem menerapkan skema masukan user dari
keyboard, yaitu:

Input = a
Jika user meng-input a, maka frame citra objek kalibrasi stereo akan
ditangkap dan disimpan dengan format portable pixel map (.ppm).

Input = s
Jika user meng-input s, maka sistem akan menyudahi proses koleksi citra
objek kalibrasi stereo. Sebelum mengakhiri program, sistem akan menulis
file list yang berisi nama-nama file citra objek kalibrasi stereo yang telah
ditangkap.

Input = escape
Jika user menekan tombol escape, maka, sistem akan keluar dengan tanpa
menulis file apapun.

Secara lebih jelasnya, skema masukan user pada tahapan koleksi citra objek
kalibrasi stereo bisa dilihat dari flow chart berikut:
Universitas Indonesia

35

Mulai

Kamera
Stereo

Simpan Citra
Stereo

Potret Stereo

Input Karakter

Input = a

Apa karakter
yang diinput?

Input = s

Tulis List Citra

Input = esc

Selesai

Gambar 3.3 Flow Chart Koleksi Citra Stereo

Setelah citra objek kalibrasi stereo didapatkan, proses kalibrasi kamera stereo bisa
dilakukan. Tahapan ini dimulai dengan mengambil citra objek kalibrasi stereo
yang telah dikumpulkan. Sistem akan mengenali citra-citra tersebut berdasarkan
informasi yang tertera dalam file list. Citra objek kalibrasi stereo akan diambil
satu persatu mulai dari awal hingga akhir. Dalam setiap pengambilan, sistem akan
melakukan pengecekan terhadap sudut-sudut papan catur yang ada dalam citra
tersebut. Jika sistem bisa mendetesi sudut-sudut papan catur dengan baik, maka
citra tersebut akan digunakan dalam proses kalibrasi kamera stereo. Namun, jika
sistem tidak bisa mendeteksi sudut-sudut papan catur dengan baik, maka citra
tersebut tidak akan digunakan.

Universitas Indonesia

36

Mulai

Citra Stereo
Papan
Catur

Ambil Citra
Tidak

Pilih Citra

Ya

Baik ?

Cek Sudut

Bukan

Citra Terakhir?

Ya
Citra Stereo
Papan
Catur yang
Baik

Kalibrasi Stereo

Rektifikasi :
Metode Bouguets

Simpan Parameter

Matrks

Korespondensi
Stereo

Selesai

Gambar 3.4 Flow Chart Proses Kalibrasi Kamera Stereo

Citra-citra yang sudut papan caturnya berhasil dideteksi dengan baik akan
dimasukkan sebagai input proses kalibrasi kamera stereo. Berdasarkan input
tersebut, sistem akan mencari nilai-nilai unsur interinsik kamera dan koefisienkoefisien distorsi. Tahapan ini merupakan tahapan inti dari proses kalibrasi
kamera stereo.

Setelah kalibrasi selesai, dilakukan tahapan rektifikasi/perbaikan

stereo. Dalam tahapan ini, citra akan diproyeksi ulang sehingga image plane dari
kedua citra seolah-olah bersifat koplanar. Tahapan rektifikasi/perbaikan stereo
menghasilkan matriks proyeksi P, matriks reproyeksi Q, dan rectification map.

Universitas Indonesia

37

Selanjutnya, sistem akan menyimpan semua matriks parameter yang didapat.


Flow chart dari proses kalibrasi kamera stereo ditampilkan dalam Gambar 3.4.

Tahapan terakhir adalah korespondensi stereo. Tahapan ini bertujuan untuk


menyamakan koordinat 3D objek dari kamera stereo. Korespondesi stereo dibagi
menjadi tiga fase, yaitu, prefiltering, correspondence, dan postfiltering. Alur dari
tahapan korespondensi stereo adalah sebagai berikut:

Prefiltering

Correspondence

Postfiltering

Gambar 3.5 Fase-fase Korespondensi Stereo

3.1.3 Perancangan Rekonstruksi 3D


Setelah kalibrasi kamera stereo selesai dan parameter-parameter kamera stereo
sudah didapatkan, tahapan rekonstruksi 3D bisa dilakukan. Inti dari tahapan ini
ialah melakukan reproyeksi objek dua dimensi pada citra stereo ke bidang tiga
dimensi. Dalam melakukan reproyeksi, dibutuhkan matriks parameter Q dan citra
disparity. Matriks Q merupakan salah satu matriks parameter yang didapat dari
proses kalibarsi kamera stereo tepatnya pada fase rektifikasi/perbaikan stereo.
Citra disparity adalah citra yang digunakan untuk menggali informasi kedalaman
objek yang didapat dari proses komparasi citra kiri dan citra kanan.

Dalam rancangan rekonstruksi 3D sistem ini, kamera stereo digunakan untuk


menangkap citra stereo. Kemudian, pada citra tersebut, dilakukan remapping.
Remapping ditujukan untuk menghilangkan distorsi yang melekat pada citra
stereo dan menjadikan agar image plane dari citra stereo tersebut bersifat
koplanar. Dalam fase remapping, dibutuhkan masukan rectification map yang
didapat pada fase rektifikasi/perbaikan stereo dalam proses kalibarsi kamera
stereo.

Universitas Indonesia

38

Setelah proses remapping selesai, langkah selanjutnya ialah mencari citra


disparity. Dalam mencari citra disparity, user dapat melakukan penyetelan
parameter-parameter BMState untuk menghasilkan citra disparity yang baik.
Penjelasan mengenai parameter-parameter ini akan ditulis pada bagian selanjutnya
dalam bab ini. Setelah citra disparity didapatkan, rekonstruksi 3D objek dapat
dilakukan. Dalam melakukan rekonstruksi, dibutuhkan matriks parameter Q. Alur
dari proses rekonstruksi 3D sistem ini adalah sebagai berikut:

Mulai

Kamera
Stereo

Ambil Gambar
Stereo

Map

Remapping Citra
Stereo

Cari Citra
Disparity

Matriks Q

Tunning
Parameter
BMState

Rekonstruksi 3D

Selesai

Gambar 3.6 Alur Rekonstruksi 3D Objek

3.1.4 Kamera
Untuk menghasilkan gambar stereo, sistem ini menggunakan dua buah kamera
dengan merek PROLINK seri PCC5020 yang memiliki resolusi maksimum 8 MP
dan kecepatan hingga 30 fps. Namun, untuk mereduksi waktu komputasi, sistem
ini tidak menggunakan kamera tersebut dengan performa maksimum. Kamera
Universitas Indonesia

39

hanya akan digunakan dengan properti tinggi 480 piksel dan properti lebar 640
piksel.
3.1.5 Data
Sistem ini menggunakan beberapa jenis data baik data yang digunakan sebagai
input, output, ataupun keduanya. Data tersebut yaitu:

Data Citra untuk Kalibrasi Stereo


Data

citra

untuk

kalibarsi

stereo

disimpan

dalam

folder

data/data_untuk_kalibrasi_stereo. Data ini merupakan data citra objek


kalibrasi stereo (citra papan catur) yang didapat dari kamera stereo. Data citra
untuk kalibrasi stereo digunakan sebagai input dari proses kalibrasi kamera
stereo.

Data Hasil Citra Kalibrasi Stereo


Data

hasil

citra

kalibrasi

stereo

disimpan

dalam

folder

data/data_hasil_citra_kalibrasi_stereo. Data ini terbagi menjadi tiga


bagian, yaitu:
1) Data Citra Disparity
Data citra disparity merupakan data yang diperoleh dari tahap
korespondensi stereo pada proses kalibrasi kamera stereo. Data ini dapat
dijadikan acuan untuk mencari informasi kedalaman suatu objek dalam
citra.
2) Data Citra Penyesuaian Baris
Data citra ini merupakan output dari tahap rektifikasi/perbaikan stereo
pada proses kalibrasi kamera stereo. Rektifikasi/perbaikan stereo bertujuan
untuk menyamakan baris dari objek tertentu pada kedua buah citra. Baik
atau tidaknya citra penyesuaian baris, salah satunya,

tergantung pada

posisi peletakan kamera. Dengan melihat citra penyesuaian baris kita bisa
melakukan evaluasi terhadap posisi kamera. Jika citra penyesuaian baris
buruk, posisi kamera bisa dirubah dan dilakukan kalibrasi ulang, sehingga,
hasil yang didapat bisa lebih optimal. Posisi kamera yang ideal ialah saling

Universitas Indonesia

40

bersifat horizontal, sehingga, image plane dari kedua kamera bisa bersifat
koplanar.
3) Data Citra Deteksi Sudut
Data citra deteksi sudut digunakan untuk melihat citra objek kalibrasi
stereo (citra papan catur) yang berhasil atau tidak berhasil dideteksi
sudutnya. Dengan melihat data ini, kita bisa mengetahui citra mana saja
yang dijadikan input dari proses kalibrasi kamera stereo.

Data List
Data list adalah data yang mengandung informasi mengenai data citra untuk
kalibrasi stereo. Data ini disimpan dalam file

data/list.txt. Sistem

mengambil citra untuk kalibrasi stereo berdasarkan informasi yang tertera


dalam data list ini.

Data Kamera
Salah satu data penting dalam sistem ini ialah data yang berasal dari kamera
stereo. Berdasarkan perintah user, sistem akan menangkap dan menyimpan
data citra stereo dari kamera stereo.

Data Matriks
o Matriks Interinsik (M)
Matriks interinsik merupakan matriks berukuran 3x3 yang mengandung
informasi unsur-unsur interinsik kamera. Matriks ini mengandung
parameter-parameter kamera fx, fy, cx, dan cy. Matriks interinsik di dapat
dari proses kalibrasi kamera stereo. Data matriks interinsik untuk kamera
sebelah kiri disimpan dalam file "data/matriks/M_kiri.xml", dan data
matriks interinsik untuk kamera sebelah kanan disimpan dalam file
"data/matriks/M_kanan.xml".
o Vektor Distorsi (D)
Vektor distorsi merupakan vektor berukuran 1x5 yang berisi informasi
tentang parameter-parameter distorsi suatu kamera, baik koefisien distorsi
radial (k1, k2, dan k3), maupun koefisien distorsi tangensial (p1, dan p2).

Universitas Indonesia

41

Vektor distorsi dihasilkan dari proses kalibrasi kamera stereo. Vektor ini
disimpan dalam file "data/matriks/D_kiri.xml untuk koefisien distorsi
kamera kiri dan file "data/matriks/D_kiri.xml untuk koefisien distorsi
kamera kanan.
o Matriks Rotasi (R)
Matriks rotasi merupakan matriks berukuran 3x3 yang dihasilkan dari
proses rektifikasi/perbaikan stereo. Matriks ini digunakan untuk melakukan
pemetaan ulang citra sehingga kedua image plane dari citra stereo bisa
seolah-olah bersifat koplanar. Matriks rotasi kamera sebelah kiri disimpan
dalam file data/matriks/R_kiri.xml dan matriks rotasi kamera sebelah
kanan disimpan dalam file data/matriks/R_kiri.xml.
o Matriks Proyeksi (P)
Matriks proyeksi adalah matriks berukuran 3x4 yang dihasilkan dari proses
rektifikasi/perbaikan stereo. Matriks proyeksi kamera kiri disimpan dalam
file data/matriks/P_kiri.xml, sedangkan, matriks proyeksi kamera kanan
disimpan dalam file data/matriks/P_kiri.xml .
o Matriks Reproyeksi (Q)
Matriks ini memiliki ukuran 4x4. Matriks Q berfungsi untuk melakukan
reproyeksi suatu objek dalam citra dua dimensi kedalam bidang tiga
dimensi. Matriks ini dihasilkan dari proses rektifikasi/perbaikan stereo.
Matriks Q terletak dalam file "data/matriks/Q.xml".
o Map (m)
Map merupakan matriks seukuran citra yang berfungsi untuk memroyeksi
ulang citra stereo. Proyeksi ulang citra stereo tersebut bertujuan untuk
menjadikan image plane dari citra stereo bersifat koplanar. Kondisi image
plane yang koplanar dibutuhkan dalam tahap korespondensi stereo. Map
dihasilkan dari proses rektifikasi/perbaikan stereo. Untuk membuat map,
dibutuhkan input matriks interinsik, vektor distorsi, matriks rotasi, dan
matriks proyeksi. Map disimpan dalam file:

"data/matriks/mx_kiri.xml

"data/matriks/my_kiri.xml

"data/matriks/mx_kanan.xml

Universitas Indonesia

42

"data/matriks/my_kanan.xml

Data Citra Uji Coba


Data citra uji coba merupakan data yang berasal dari Middlebury Stereo
Datasets (http://vision.middlebury.edu/stereo). Data tersebut merupakan data
citra stereo dengan tekstur tinggi. Fungsi dari data tersebut dalam penelitian
ini ialah untuk menguji baik atau tidaknya proses stereo correspondence
dalam proses kalibrasi kamera stereo. Selain itu, untuk melakukan
rekonstruksi, penulis juga akan menggunakan data yang berasal dari Hamlyn
Center Laparoscopic/Endoscopic Video Datasets (http://hamlyn.doc.ic.ac.uk/
vision).

3.2 Implementasi
Bagian ini akan menjelaskan tentang implementasi sistem yang dibuat.

3.2.1 Program Utama


Pada program utama, ada tiga fungsi yang dipanggil, yaitu koleksiCitraStereo,
kalibrasiStereo,

rekonstruksi_objek.

Fungsi

pertama

betugas

untuk

mengumpulkan citra objek kalibrasi stereo dan menyimpannya dalam folder


data/data_untuk_kalibrasi_stereo. Citra-citra tersebut akan digunakan sebagai
input dari proses kalibrasi kamera stereo.

Fungsi kedua, kalibrasiStereo, bertugas melakukan kalibrasi kamera stereo.


Fungsi tersebut memiliki empat parameter, yaitu, nama file list, jumlah sudut
internal horizontal papan catur, jumlah sudut internal vertikal papan catur, dan
panjang sisi setiap kotak papan catur dalam satuan sentimeter. Penelitian ini
menggunakan objek papan catur dengan dimensi sudut internal 6x9 dan memiliki
ukuran panjang kotak 2.8 cm.

Fungsi ketiga, rekonstruksi_objek, bertugas untuk melakukan rekonstruksi 3D


objek. Fungsi tersebut menggunakan PCLVisualizer yang terdapat pada library
PCL sebagai media visualisasi objek 3D.

Universitas Indonesia

43

int main(int args, char** argv) {


koleksiCitraStereo();
kalibrasiStereo("data/list.txt", 9, 6, 2.8);
rekonstruksi_objek ();
return 0;
}

3.2.2 Masukan
Ada beberapa jenis masukan dalam sistem ini, masukan yang paling utama adalah
masukan dari kamera stereo. Untuk menangkap citra yang dihasilkan dari kamera
stereo, OpenCV menyediakan fungsi cvCreateCameraCapture yang memiliki
argumen indeks kamera yang ditangkap. Sistem ini menggunakan kamera stereo,
dengan indeks 1 untuk kamera kiri dan indeks 2 untuk kamera kanan, sehingga,
citra stereo bisa ditangkap dengan:

capture1 = cvCreateCameraCapture(1);
capture2 = cvCreateCameraCapture(2);

Untuk mengatur properti kamera seperti dimensi piksel, kecepatan frame, dll,
digunakan fungsi cvSetCaptureProperty. Sistem ini menggunakan properti tinggi
480 piksel dan properti lebar 640 piksel, sehingga, fungdi tersebut dipanggil
dengan parameter-parameter sebagai berikut:

cvSetCaptureProperty( capture1, CV_CAP_PROP_FRAME_WIDTH, 640 );


cvSetCaptureProperty( capture1, CV_CAP_PROP_FRAME_HEIGHT, 480 );
cvSetCaptureProperty( capture2, CV_CAP_PROP_FRAME_WIDTH, 640 );
cvSetCaptureProperty( capture2, CV_CAP_PROP_FRAME_HEIGHT, 480 );

Setelah menangkap citra dari kamera stereo, sistem akan menampilkan citra
tersebut. Untuk melakukan hal itu, sistem menggunakan fungsi tampilkanStereo

Universitas Indonesia

44

yang berisi empat parameter, yaitu, citra kanan, citra kiri, ukuran citra, dan nama
window.

tampilkanStereo(Mat frame1, Mat frame2, CvSize ukuran, string nama)


Fungsi tampilkanStereo merupakan fungsi yang menggabungkan citra kanan dan
citra kiri menjadi satu citra. Setelah itu fungsi tersebut akan menampilkan citra
gabungan itu dengan fungsi yang disediakan oleh OpenCV, yaitu imshow. Output
dari fungsi tampilkanStereo adalah sebagai berikut:

Gambar 3.7 Output Fungsi tampilkanStereo

Untuk menyimpan citra stereo yang dihasilkan dari kamera stereo, sistem
menyediakan fungsi potretStereo. Fungsi tersebut berfungsi untuk memotret
frame dari citra stereo yang diinginkan. Frame akan disimpan dalam file bertipe
portable pixel map (.ppm).

void potretStereo(Mat frame1, Mat frame2,int counter, string nama)

Fungsi potretStereo berisi empat parameter, yaitu, citra kanan, citra kiri, counter,
dan

nama

file.

Fungsi

akan

menyimpan

citra

dalam

folder

data/data_untuk_kalibrasi_stereo dengan nama kanan_x.ppm untuk citra


kanan dan kiri_x.ppm untuk citra kiri, dengan x merupakan nilai dari variabel
counter yang menyatakan urutan citra saat disimpan. Untuk menulis file, fungsi
Universitas Indonesia

45

potretStereo menggunakan fungsi yang telah disediakan oleh OpenCV, yaitu


imwrite.
Setelah file disimpan, sistem akan mencatat nama file tersebut pada data list. Data
list sendiri disimpan dalam direktori data/list.txt. File list akan dijadikan acuan
untuk mengambil citra objek kalibrasi stereo pada proses kalibrasi kamera stereo.
Untuk membuat data list, sistem akan memanggil fungsi buatList. Contoh dari file
list adalah sebagai berikut:

data/citra_untuk_kalibrasi_stereo/kiri_1.ppm
data/citra_untuk_kalibrasi_stereo/kanan_1.ppm
data/citra_untuk_kalibrasi_stereo/kiri_2.ppm
data/citra_untuk_kalibrasi_stereo/kanan_2.ppm
data/citra_untuk_kalibrasi_stereo/kiri_3.ppm
data/citra_untuk_kalibrasi_stereo/kanan_3.ppm
3.2.3 Kalibrasi Kamera Stereo
Kalibrasi kamera stereo dimulai dari mengambil citra objek kalibarsi stereo (citra
papan catur). Sistem mengambil citra-citra tersebut berdasarkan informasi yang
tertera dalam data list (data/list.txt). Setelah citra diambil, dilakukan
pendeteksian sudut-sudut internal terhadap objek papan catur yang terdapat pada
citra. Dalam pendeteksian sudut internal tersebut, sistem menggunakan fungsi
cvFindChessboardCorners yang terdapat dalam library OpenCV sebagai berikut:
Hasil = cvFindChessboardCorners(temp_image, cvSize(nx, ny),
&temp[0], &count, CV_CALIB_CB_ADAPTIVE_THRESH
| CV_CALIB_CB_NORMALIZE_IMAGE);
Fungsi cvFindChessboardCorners memiliki lima parameter. Parameter pertama
adalah citra objek kalibrasi stereo. Parameter kedua, bertipa CvSize, adalah
informasi tentang dimensi sudut internal papan catur. Parameter ketiga, pointer
array, bertugas mencatat informasi tentang lokasi sudut-sudut internal yang telah
berhasil ditemukan dalam citra objek kalibrasi stereo.

Universitas Indonesia

46

Parameter keempat, pointer integer, menyatakan jumlah sudut internal yang telah
berhasil dideteksi. Parameter ini akan terus ditambah nilainya setiap kali sistem
berhasil mendeteksi sudut internal papan catur. Parameter terakhir merupakan
filter tambahan yang akan diterapkan sistem terhadap citra. Sistem ini
menggunakan

filter

CV_CALIB_CB_ADAPTIVE_THRESH

CV_CALIB_CV_NORMALIZE_IMAGE

yang

berarti

akan

dan

diterapkan

mekanisme adaptive threshold dalam menemukan sudut dan pencahayaan citra


akan dinormalisasikan terlebih dahulu dengan fungsi cvEqualizeHist sebelum
diproses.

Jika fungsi berhasil mendeteksi sudut dengan baik, maka fungsi ini akan
mengembalikan nilai integer bukan nol yang akan disimpan dalam variabel hasil.
Setelah

pendeteksian

sudut

dilakukan,

sistem

akan

memanggil

fungsi

cvDrawChessboardCorners yang bertugas untuk menggambar sudut-sudut


terdeteksi pada citra objek kalibrasi stereo. Hasil dari penggambaran sudut akan
disimpan dalam folder data/data_hasil_citra_kalibrasi_stereo/sudut. Contoh
penggambaran sudut yang berhasil terdeteksi adalah sebagai berikut:

Gambar 3.8 Sudut-sudut Internal Papan Catur yang Berhasil Terdeteksi

Berdasarkan berhasil atau tidaknya pendeteksian sudut-sudut internal pada citra


objek kalibrasi stereo (citra papan catur), dilakukan seleksi terhadap citra. Hanya
citra-citra yang sudut internalnya berhasil dideteksi saja yang akan digunakan
sebagai input dari proses kalibrasi kamera stereo.

Universitas Indonesia

47

Langkah selanjutnya ialah kalibrasi kamera stereo. Kalibrasi kamera stereo


dilakukan dengan memanggil fungsi cvStereoCalibrate yang terdapat dalam
OpenCV sebagai berikut:
cvStereoCalibrate(&koordinatObjek, &koordinatObjek_kiri,
&koordinatObjek_kanan,

&banyakTitik,

&M_kiri,

&D_kiri, &M_kanan,&D_kanan, ukuranImage,


&R, &T, &E, &F,
cvTermCriteria(CV_TERMCRIT_ITER+
CV_TERMCRIT_EPS, 100, 1e-5),
CV_CALIB_FIX_ASPECT_RATIO+
CV_CALIB_ZERO_TANGENT_DIST+
CV_CALIB_SAME_FOCAL_LENGTH );
Fungsi cvStereoCalibrate memiliki lima belas argumen. Argumen pertama adalah
matriks berukuran 1xN yang memiliki tiga kanal, dengan, N merupakan jumlah
titik-titik sudut internal dari seluruh citra objek kalibrasi stereo yang berhasil
dideteksi sudutnya. Matriks tersebut akan mencatat koordinat 3D (koordinat
nyata) objek. Argumen kedua dan ketiga adalah matriks berukuran 1xN yang
memiliki dua kanal. Matriks-matriks tersebut akan mencatat koordinat 2D objek
pada citra kiri dan kanan. Argumen-argumen selanjutnya adalah matriks interinsik
kamera kiri, vektor distorsi kamera kiri, matriks interinsik kamera kanan, vektor
distorsi kamera kanan, ukuran citra, matriks rotasi, vektor translasi, matriks
esensial, matriks fundamental, term criteria, dan flag.

Proses selanjutnya adalah rektifikasi/perbaikan stereo. OpenCV menyediakan dua


alternatif

untuk

melakukan

rektifikasi/perbaikan

stereo,

yaitu,

dengan

menggunakan algoritma Hartley dan algoritma Bouget. Sistem ini menggunakan


metode Bouget karena metode tersebut menghasilkan lebih sedikit distorsi. Untuk
melakukan rektifikasi/perbaikan stereo dengan metode Bouget, sistem memanggil
fungsi cvStereoRectify, yaitu:

Universitas Indonesia

48

cvStereoRectify(&M_kiri, &M_kanan, &D_kiri, &D_kanan, ukuranImage,


&R, &T,&R_kiri, &R_kanan, &P_kiri, &P_kanan, &Q, 0);
Fungsi cvStereoRectify memiliki tiga belas argumen. Argumen pertama dan kedua
adalah matriks interinsik kamera kiri dan kamera kanan. Argumen ketiga dan
keempat adalah vektor distorsi kamera kiri dan kamera kanan. Argumen kelima
adalah ukuran citra. Argumen keenam dan ketujuh masing-masing adalah matriks
rotasi dan vektor translasi. Argumen kedelepan dan kesembilan adalah matriks
rotasi berukuran 3x3 kamera kiri dan kamera kanan. Kedua matriks rotasi tersebut
berguna untuk merotasi citra kamera kiri dan citra kamera kanan sedemikian rupa
sehingga garis epipolarnya bersifat horizontal dan image plane dari kedua kamera
tersebut bersifat koplanar. Argumen kesepuluh dan kesebelas adalah matriks
proyeksi P kamera kiri dan kamera kanan. Matriks P dibutuhkan untuk membuat
map. Argumen keduabelas adalah matriks reproyeksi Q. Matriks Q merupakan
salah satu parameter penting yang dibutuhkan pada tahap rekonstruksi 3D objek.
Argumen terakhir adalah flag.

Setelah rektifikasi/perbaikan stereo dilakukan, sistem akan membuat rectification


map. Map tersebut berguna untuk memetakan ulang citra sehingga image plane
dari kedua kamera bisa seolah-olah bersifat koplanar dan garis epipolar bayangan
objek bisa seolah-olah sama untuk kamera kiri dan kamera kanan. Untuk
membuat map, sistem akan memanggil fungsi cvInitUndistortRectifyMap, untuk
masing-masing kamera, yaitu:
cvInitUndistortRectifyMap(&M_kiri, &D_kiri, &R_kiri,
&P_kiri, mx_kiri,my_kiri);
cvInitUndistortRectifyMap(&M_kanan, &D_kanan, &R_kanan,
&P_kanan, mx_kanan,my_kanan);

Fungsi cvInitUndistortRectifyMap enam argumen. Argumen pertama sampai


keempat, masing-masing adalah, matriks interinsik, vektor distorsi, matriks rotasi,
matriks proyeksi. Dua argumen terakhir adalah
cvInitUndistortRectifyMap

output

dari fungsi

yaitu map-x dan map-y. Map-map tersebut akan


Universitas Indonesia

49

dijadikan acuan untuk melakukan proyeksi ulang citra (remapping). Perbandingan


citra sebelum dan sesudah dilakukan remapping bisa dilihat dalam Gambar 3.9.

Gambar 3.9 Citra Sebelum Remapping (kiri) dan Sesudah Remapping (kanan)

Selanjutnya, sistem akan menyimpan seluruh matriks parameter yang telah


didapatkan. Matriks-matris akan disimpan dalam file data/matriks dengan
fungsi cvSave, yaitu sebagai berikut:
cvSave("data/matriks/M_kiri.xml", &M_kiri);
cvSave("data/matriks/M_kanan.xml", &M_kanan);
cvSave("data/matriks/D_kiri.xml", &D_kiri);
cvSave("data/matriks/D_kanan.xml", &D_kanan);
cvSave("data/matriks/R_kiri.xml", &R_kiri);
cvSave("data/matriks/R_kanan.xml", &R_kanan);
cvSave("data/matriks/P_kiri.xml", &P_kiri);
cvSave("data/matriks/P_kanan.xml", &P_kanan);
cvSave("data/matriks/Q.xml", &Q);
cvSave("data/matriks/mx_kiri.xml", mx_kiri);
cvSave("data/matriks/my_kiri.xml", my_kiri);
cvSave("data/matriks/mx_kanan.xml", mx_kanan);
cvSave("data/matriks/my_kanan.xml", my_kanan);

Universitas Indonesia

50

Proses terakhir dari kalibrasi kamera stereo adalah korespondensi stereo.


Korespondensi stereo adalah proses penyamaan koordinat 3D objek dari kamera
kiri dan kamera kanan. Korespondensi stereo dilakukan pada daerah yang
beririsan antara citra kanan dan citra kiri. Output dari proses ini stereo adalah citra
disparity. Citra disparity merupakan citra yang bisa digunakan untuk menggali
informasi tentang kedalaman objek. Korespondensi kamera stereo dilakukan
dengan memanggil fungsi cvFindStereoCorrespondenceBM. Fungsi tersebut
mengimplementasikan algoritma block-matching stereo yang dikembangkan oleh
Kurt Konolige. Untuk menemukan fitur yang bersesuaian, algoritma blockmatching stereo menggunakan metode SAD.

cvFindStereoCorrespondenceBM(img_kiri, img_kanan, disp, BMState);

Fungsi cvFindStereoCorrespondenceBM memiliki empat argumen. Argumen


pertama dan kedua adalah citra kiri dan citra kanan. Argumen ketiga adalah citra
disparity. Citra disparity memiliki ukuran yang sama dengan citra masukan.
Argumen terakhir adalah BMState. BMState berisikan parameter-parameter yang
akan menentukan kualitas dari citra disparity yang diperoleh. Parameterparameter tersebut yaitu:

SADWindowSize, menyatakan ukuran dari window SAD yang digunakan


dalam argoritma block-matching stereo.

preFilterSize, menyatakan ukuran window untuk melakukan normalisasi


citra pada tahap prefiltering.

preFilterCap, menyatakan nilai pemotongan piksel citra pada tahap


prefiltering.

minDisparity, menyatakan nilai disparity minimum dari citra disparity.

numberOfDisparities, menyatakan banyaknya nilai disparity dari citra


disparity. Nilai dari parameter ini memiliki rentang minDisparity
maxDisparity dan harus dapat dibagi dengan 64.

textureThreshold, adalah batas ambang dari tekstur citra. Parameter ini


akan digunakan pada tahap postfiltering untuk menyeleksi fitur yang telah
dikorespondensi yang tidak memiliki ketajaman tekstur yang diinginkan.
Universitas Indonesia

51

uniquinessRatio, adalah prosentase batas yang dijadikan acuan untuk


melakukan filtrasi kandidat fitur yang telah dikorespondensi.

Sebelum melakukan rekonstruksi 3D, user dapat melakukan tuning terhadap


parameter BMState. Tujuan dari proses tuning adalah untuk menemukan citra
disparity yang baik. Citra disparity yang baik dibutuhkan untuk membentuk objek
3D yang berkualitas.
3.2.4 Rekonstruksi 3D
Setelah kalibrasi kamera stereo selesai dan matriks-matriks parameter didapatkan,
rekonstruksi 3D objek bisa dilakukan. Rekonstruksi 3D objek membutuhkan
matriks reproyeksi Q dan citra disparity. Proses rekonstruksi sistem ini mengacu
pada persamaan (2.26) dan (2.27), yaitu, dengan mencari matriks [X Y Z W]T.

X = static_cast<double>(j) + Q.at<double>(0,3);
Y = static_cast<double>(i) + Q.at<double>(1,3);
Z = Q.at<double>(2,3);
W=static_cast<double>(d) * Q.at<double>(3,2) + Q.at<double>(3,3);
Setelah matriks [X Y Z W]T didapatkan, koordinat 3D objek bisa dihitung dengan
mengacu pada persamaan (2.27), yaitu:
koor_X = X/W;
koor_Y = Y/W;
koor_Z = Z/W;

Langkah terakhir ialah menampilkan objek 3D. Untuk melakukan visualisasi ini,
sistem menggunakan program PCL (Point Cloud Libraray). Objek akan
ditampilkan dalam media visualizer pada PCL. Sebelum ditampilkan, objek yang
sudah dalam representasi 3D tersebut harus didaftarkan dulu dalam point cloud.
Inisiasi dari point cloud adalah sebagai berikut:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr

Universitas Indonesia

52

point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);


Seteleh point cloud diinisiasi, semua titik objek dapat didaftarkan dalam point
cloud tersebut. Titik-titik itu harus dimasukkan terlebih dahulu ke dalam variabel
bertipe pcl::PointXYZRGB, sebagai berikut:

pcl::PointXYZRGB point;
point.x = koor_X;
point.y = koor_Y;
point.z = koor_Z;

Selanjutnya, setiap titik dapat diregistrasi ke dalam point cloud.


point_cloud_ptr->points.push_back (point);
Setelah point cloud terisi, visualizer akan melakukan visualisasi point cloud
kedalam ruang 3D. Fungsi untuk memanggil visualizer adalah sebagai berikut:
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
viewer = createVisualizer(point_cloud_ptr);

3.2.5 Perhitungan Error


Pada bagian akhir bab ini, akan dibahas tentang perhitungan error. Nilai error
merupakan salah satu parameter yang bisa digunakan untuk melihat kualitas
kamera stereo yang terbentuk. Dalam penelitian ini, nilai error akan digunakan
sebagai salah satu bahan eksperimen. Perhitungan error dilakukan untuk menguji
kualitas dari proses kalibrasi kamera stereo yang dilakukan. Pembahasan dan
analisis lebih jauh tentang nilai error sistem ini terhadap uji coba yang dilakukan
akan disajikan dalam bab selanjutnya. Bagian ini hanya akan membahas
bagaimana nilai error dihitung.

Dalam melakukan evaluasi, sistem menggunakan garis-garis epipolar sebagai


acuan untuk menghitung error. Dalam bab sebelumnya, telah disinggung, bahwa,

Universitas Indonesia

53

garis epipolar merupakan garis yang terbentuk dari irisan bidang epipolar dengan
image plane. Sedangkan, bidang epipolar adalah bidang yang terbentuk dari pusat
proyeksi kamera kanan, pusat proyeksi kamera kiri, dan objek. Ilustrasi dari garis
epipolar dan bidang epipolar bisa dilihat dalam Gambar 3.10.

Gambar 3.10 Garis Epipolar dan Bidang Epipolar


Sumber: Cry Engine Documentation. Photobump Guide. Retrieved Mei 15, 2012, from
http://freesdk.crydev.net/display/SDKDOC3/Photobump. (telah diolah kembali)

Sama dengan garis lain, garis epipolar bisa direpresentasikan dalam persamaan:

ax + by + c = 0.

Garis merupakan kumpulan dari banyak titik yang memenuhi persamaan garis.
Dengan kata lain, jika suatu titik ( , ) berada dalam garis, maka, titik tersebut
akan memenuhi persamaan garis. Konsep tersebut akan digunakan dalam proses
pencarian nilai error.

Setiap titik proyeksi pada image plane memiliki garis epipolarnya masing-masing.
Dalam sistem, garis-garis epipolar disimpan dalam matriks berukuran 1xN yang
memiliki tiga kanal. Setiap anggota dari matriks tersebut menyimpan koefisien a,
Universitas Indonesia

54

b, dan c pada persamaan garis untuk setiap titik proyeksi yang dimasukkan dalam
tahap kalibrasi kamera stereo. Sistem mendapatkan koefisien-koefisien garis-garis
epipolar dengan menjalankan fungsi:

cvComputeCorrespondEpilines(&koordinatObjek_kiri, 1, &F, &G_1);


cvComputeCorrespondEpilines(&koordinatObjek_kanan, 2, &F, &G_2);
Parameter dari fungsi adalah koordinat objek, matriks fundamental, dan vektor
garis. Setelah koefisien-koefisien garis-garis epipolar diketahui, perhitungan error
bisa dilakukan. Perhitungan error dilakukan dengan mempertemukan titik
proyeksi dengan garis epipolarnya. Jika sistem melakukan kalibrasi kamera stereo
secara sempurna, semestinya, nilai yang dihasilkan dari proses substitusi suatu
titik proyeksi dengan garis epipolarnya adalah nol karena titik tersebut semestinya
persis berada pada garis epipolar. Namun, jika titik proyeksi tidak menghasilkan
nol pada saat dimasukkan ke dalam garis, maka itu akan dihitung sebagai nilai
error. Proses substitusi titik proyeksi ke garis epipolarnya adalah sebagai berikut:

tempError = fabs((garis[1][i].x * koordinatObjek2D[0][i].x


+ garis[1][i].y * koordinatObjek2D[0][i].y + garis[1][i].z))
+ fabs((garis[0][i].x * koordinatObjek2D[1][i].x + garis[0][i].y *
koordinatObjek2D[1][i].y + garis[0][i].z));

Universitas Indonesia

55

BAB 4
HASIL EKSPERIMEN DAN ANALISIS
Bab ini membahas hasil eksperimen yang dilakukan dalam penelitian. Selain itu,
bab ini juga memaparkan analisis penulis terhadap hasil eksperimen tersebut.
4.1 Rancangan Eksperimen
Sebelum memulai eksperimen, penulis terlebih dahulu membuat rancangan
eksperimen. Rancangan meliputi parameter eksperimen, variabel eksperimen, dan
batasan ekperimen.
4.1.1 Parameter Eksperimen
Dalam penelitian ini, akan dilakukan dua eksperimen. Pada eksperimen pertama,
parameter yang diamati adalah nilai error yang muncul. Nilai error didapat
dengan melakukan substitusi seluruh titik sudut internal citra objek kalibrasi
stereo (citra papan catur) dengan garis epipolarnya. Nilai error dapat digunakan
untuk melihat bagaimana kualitas kamera stereo yang terbentuk dari proses
kalibrasi kamera stereo. Pada eksperimen kedua, parameter yang diamati adalah
citra disparity. Citra disparity merupakan salah satu parameter penting dalam
melaukan rekonstruksi. Dengan mengamati citra disparity, gambaran tentang
kualitas dari hasil rekonstruksi 3D bisa diproyeksikan. Selain itu, parameter yang
akan diamati pada eksperimen kedua ini adalah objek 3D itu sendiri.
4.1.2 Variabel Eksperimen
Untuk bisa mengukur posisi 3D suatu objek dengan baik, kamera stereo (kamera
kiri dan kamera kanan) harus diletakkan dalam rentang jarak yang tepat. Pada
penelitian kali ini, penulis mencoba melakukan eksperimen untuk mendapatkan
rentang jarak yang tepat tersebut. Kamera akan diletakkan pada jarak yang
bervariasi antara 7 s.d. 15 cm. Dalam setiap rentang jarak tersebut, akan dihitung
nilai error yang muncul dari proses kalibrasi kamera stereo. Selain faktor jarak
kamera, penulis juga ingin mengetahui dampak dari sedikit atau banyaknya
penggunaan citra objek kalibrasi kamera stereo (citra papan catur) sebagai input
dari proses kalibrasi kamera stereo terhadap kualitas kamera stereo yang
55

Universitas Indonesia

56

dihasilkan. Untuk itu, penulis akan melakukan eksperimen dengan membuat


variasi jumlah citra objek kalibrasi stereo yang digunakan sebagai input dari
proses kalibrasi kamera stereo, yaitu, 6 pasang citra, 9 pasang citra, 12 pasang
citra, dan 15 pasang citra. Pada masing-masing jumlah tersebut, juga akan
dilakukan perhitungan error. Pada eksperimen kedua, penulis akan melakukan
tuning terhadap parameter BMState. Tuning dilakukan untuk mendapatkan citra
disparity yang baik.

Dari pemaparan diatas, bisa disimpulkan bahwa variabel yang digunakan dalam
penelitian kali ini adalah:

Eksperimen pertama: jarak kamera dan banyak citra objek kalibrasi stereo

Eksperimen kedua: parameter BMState

4.1.3 Batasan Eksperimen


Batasan pada eksperimen pertama adalah:

Objek kalibrasi stereo yang digunakan harus sama. Dalam eksperimen ini,
penulis menggunakan citra objek kalibrasi stereo papan catur berukuran
2,8 cm dengan jumlah sudut internal horizontal adalah sembilan dan
jumlah sudut internal vertikal adalah enam.

Selain objek kalibrasi stereo, variasi pose objek kalibrasi stereo juga harus
sama untuk setiap pengambilan gambar.

Objek kalibrasi stereo harus berjarak kurang dari lima meter terhadap
kamera.

Resolusi kamera adalah 480x640 piksel.

Ruang eksperimen harus memiliki pencahayaan yang memadai.

Citra tidak dalam kondisi bergerak.

Batasan pada eksperimen kedua adalah:

Resolusi kamera adalah 480x640 piksel.

Ruang eksperimen harus memiliki pencahayaan yang memadai.

Citra tidak dalam kondisi bergerak.

Universitas Indonesia

57

4.2 Eksperimen
Seperti disebutkan sebelumnya, dalam penelitian kali ini, penulis akan mencoba
melakukan dua eksperimen. Dalam eksperimen pertama, penulis akan mengamati
nilai error pada berbagai variasi rentang jarak kamera stereo dan variasi jumlah
input citra objek kalibrasi yang digunakan. Pada eksperimen kedua penulis akan
melakukan analisis terhadap hasil citra disparity yang diperoleh dari berbagai citra
stereo.
4.3 Hasil Eksperimen Pertama
Hasil eksperimen pertama tersaji dalam tabel berikut:

Tabel 4.1 Nilai Error Kalibrasi Stereo

Banyak Citra Objek Kalibrasi Stereo

Jarak Antar

Rataan

Kamera

6 citra stereo

9 citra stereo

12 citra stereo

15 citra stereo

7 cm

7,8536

5,6641

4,4324

3,5855

5,3839

8 cm

6,7670

4,7434

3,6366

2,8025

4,4874

9 cm

6,0833

4,3198

3,3252

2,5781

4,0766

10 cm

5,7553

3,8840

2,7926

2,1411

3,6433

11 cm

5,6554

3,8669

2,8943

2,3728

3,6973

12 cm

6,0923

5,0533

3,3118

2,5754

4,2582

13 cm

6,0658

4,0862

3,1755

2,5501

3,9694

14 cm

6,5730

4,1943

3,5846

2,6126

4,2411

15 cm

8,1012

5,1654

3,8217

3,0764

5,0412

Dari sajian data diatas, terlihat bahwa, nilai error terkecil terdapat pada kamera
stereo yang berjarak 10 cm atau 11 cm, dan ada kecenderungan kenaikan nilai
error pada kamera stereo yang berjarak semakin kecil atau semakin besar dari itu.
Kecenderungan itu bahkan berlaku hampir pada setiap variasi jumlah citra objek
kalibrasi stereo. Fenomena tersebut akan penulis coba kaitkan dengan konsep
binocular vision.

Kamera stereo mengimitasi kemampuan manusia dalam melihat objek yang


disebut dengan kemampuan binocular vision. Dengan kemampuan tersebut,
Universitas Indonesia

58

manusia bisa mendapatkan persepsi tentang kedalaman benda yang diamati.


Persepsi itu didapatkan dengan membandingkan perolehan objek yang ditangkap
oleh mata kanan dan mata kiri. Dalam kamera stereo, perhitungan kedalaman
objek dilakukan dengan metode triangulasi. Metode triangulasi menghitung
kedalaman objek berdasarkan nilai disparity dari objek tersebut. Nilai disparity
adalah nilai yang merepresentasikan perbedaan koordinat sumbu-x objek untuk
fitur yang bersesuaian di kedua citra. Berdasarkan definisi itu, kita bisa
mengetahui bahwa nilai disparity sangat berkaitan erat dengan jarak antara kedua
kamera. Semakin jauh jarak kamera, maka, nilai disparity dari sebuah objek akan
semakin tinggi, sebaliknya, semakin dekat jarak kamera, maka, nilai disparity dari
sebuah objek akan semakin kecil.

Dalam dunia teori, metode triangulasi bisa digunakan untuk menghitung jarak
objek secara tepat asalkan kedua titik acuan memiliki jarak yang bukan nol.
Namun, kondisi ideal tersebut tidak berlaku dalam kasus ini. Jika jarak kamera
semakin diperkecil, maka sudut pandang kamera akan menjadi sempit. Dalam
kondisi seperti ini, sedikit perubahan nilai disparity akan berakibat banyak pada
perubahan nilai kedalaman. Sebaliknya, jika jarak kamera semakin diperbesar,
maka sudut pandang kamara akan menjadi lebar. Dalam kondisi ini, perubahan
nilai disparity tidak akan berakibat banyak pada perubahan nilai kedalaman. Hal
tersebut terjadi karena nilai disparity dan unsur kedalaman benda bersifat
berbanding terbalik. Dalam kondisi ideal, hal itu tidak menjadi masalah yang
berarti. Namun, dalam kasus ini, kondisi tersebut harus menjadi bagian yang mesti
diperhitungkan, karena, nilai disparity yang digunakan memiliki rentang yang
terbatas yaitu delapan bit, artinya, nilai disparity hanya memiliki banyak variasi
256 nilai. Dalam rentang yang terbatas itu, penentuan jarak kamera harus
dilakukan sebijaksana mungkin sehingga nilai disparity yang didapat bisa
representatif terhadap kedalaman objek yang diinginkan.

Dalam eksperimen ini, berdasarkan data yang diperoleh, kamera stereo dengan
performa optimal diperoleh jika kamera tersebut direntangkan pada jarak sekitar

Universitas Indonesia

59

10 cm. Secara lebih lengkap, grafik hubungan jarak kamera stereo dengan nilai
error bisa dilihat pada Gambar 4.1.

Gambar 4.1 Grafik Hubungan Jarak Kamera Stereo dengan Nilai Error

Kecenderungan lain yang bisa diamati dari tabel diatas adalah adanya penurunan
nilai error pada setiap penambahan citra objek kalibrasi stereo. Artinya, semakin
banyak citra objek kalibrasi stereo yang digunakan dalam proses kalibrasi kamera
stereo, maka semakin baik kualitas kamera stereo yang dihasilkan. Grafik
hubungan jumlah citra objek kalibrasi dengan nilai error bisa dilihat pada Gambar
4.2.

Gambar 4.2 Grafik Hubungan Jumlah Citra Objek Kalibrasi dengan Nilai Error

Universitas Indonesia

60

Proses kalibrasi kamera stereo menggunakan titik-titik internal sudut papan catur
dalam melakukan kalibrasi. Berdasarkan titik-titik internal tersebut, yang sudah
diketahui jarak dan jumlahnya pada duni riil, algoritma kalibrasi melakukan
perhitungan untuk mendapatkan unsur-unsur interinsik dan koefisien-koefisien
distorsi kamera. Semakin banyak citra objek kalibrasi (citra papan catur) yang
digunakan, maka semakin banyak pula titik-titik yang dimasukkan ke fungsi
kalibrasi stereo. Semakin banyak titik-titik yang dijadikan input dalam proses
kalibrasi kamera stereo, semestinya, kamera stereo yang dihasilkan akan lebih
baik karena proses kalibrasi dilakukan secara lebih komprehensif. Dari data
penelitian, terlihat bahwa penggunaan jumlah citra objek kalibrasi berkorelasi
positif dengan kualitas kamera stereo yang terbentuk.
4.4 Hasil Eksperimen Kedua
Dalam eksperimen kedua, dilakukan analisis terhadap citra disparity. Dalam
bagian pertama eksperimen kedua ini, citra disparity yang akan dibahas ialah citra
disparity yang didapat dari citra yang berasal dari kamera stereo sistem ini.
Sebelum dicari citra disparity-nya, citra dari kamera stereo di-remap terlebih
dahulu

berdasarkan

rectification

map

yang

diperoleh

pada

fase

rektifikasi/perbaikan stereo pada proses kalibrasi kamera stereo. Citra stereo dan
citra disparity yang diperoleh dari eksperimen kedua bagian pertama bisa dilihat
pada Gambar 4.3.

(a)

Universitas Indonesia

61

(b)
Gambar 4.3 (a) Citra Stereo Dapur Rumah (b) Citra Disparity Dapur Rumah

Dari hasil eksperimen kedua pada bagian pertama, terlihat citra disparity yang
diperoleh tidak begitu baik. Penulis sudah mencoba untuk melakukan tuning
sedemikian rupa dengan harapan untuk mendapatkan citra disparity yang baik,
namun, hasilnya tidak ada yang memuaskan. Bahkan, penulis juga mencoba untuk
melakukan beberapa kalibrasi ulang untuk mendapatkan hasil yang terbaik,
namun, output-nya sama saja. Setelah mendalami beberapa referensi, penulis
menyimpulkan bahwa masalah yang terjadi disebabkan oleh kondisi citra yang
tidak memiliki tekstur yang tinggi.

Dalam mencari citra disparity, sistem ini menggunakan algoritma block-matching


stereo yang mengimplementasikan metode SAD (sum of absolute difference)
untuk mencari fitur yang bersesuaian antara kedua citra. Performa dari algoritma
block-matching stereo sebenarnya cukup baik karena memiliki waktu komputasi
yang relatif cepat, namun, permasalahan dari metode ini ialah hanya bisa efektif
bekerja pada citra yang memiliki tekstur tinggi.

Dalam dunia fotografi, citra yang memiliki tekstur tinggi didapat dengan cara
menaikkan derajat ketajaman (sharpness) dan kontras pada kamera. Secara
natural, citra yang memiliki tekstur tinggi mudah didapat pada daerah terbuka
seperti hutan. Namun, pada daerah tertutup (indoor), biasanya, citra yang didapat
akan memiliki tekstur yang rendah, apalagi, jika kamera yang digunakan tidak
memiliki kualitas yang baik. Dampak dari rendahnya tekstur pada citra dalam
implementasi algoritma block-matching stereo adalah sedikitnya titik atau piksel

Universitas Indonesia

62

pada citra yang meregistrasi informasi kedalamannya. Hal tersebut karena pada
algoritma block-matching stereo terdapat tahapan postfiltering yang bertugas
untuk menyeleksi kandidat fitur yang bersesuaian berdasarkan kadar kecukupan
tekstur. Jika kandidat fitur yang bersesuaian tidak memiliki tekstur yang melebihi
ambang yang diperbolehkan dalam TextureThreshold, maka kandidat fitur
tersebut akan dieliminasi dan tidak diregistrasi unsur kedalamannya. Dalam citra
disparity, titik yang tidak teregistrasi informasi kedalamannya direpresentasikan
dengan warna hitam. Artinya, bisa disimpulan bahwa citra disparity yang buruk
adalah citra disparity yang banyak mengandung unsur warna hitam. Walaupun, itu
bukan merupakan satu-satunya parameter dalam menilai baik atau buruknya citra
disparity yang diperoleh.

Dalam penelitian ini, kamera stereo yang digunakan hanyalah webcam biasa yang
bisa dibilang tidak memiliki kualitas yang begitu baik. Dengan kondisi itu, sangat
dimungkinkan citra yang ditangkap tidak memiliki tekstur yang tinggi. Ditambah
lagi, pengambilan gambar dilakukan tidak di daerah terbuka, melainkan di dalam
rumah. Oleh karena itu, untuk membuktikan apakah penyebab buruknya kualitas
citra disparity yang diperoleh dari kamera stereo adalah benar karena rendahnya
tekstur dari citra, penulis akan mencoba untuk melakukan komparasi dengan
memasukkan input citra stereo yang berasal dari Middlebury Stereo Datasets.
Citra yang diambil dari datasets itu sudah bisa dipastikan memiliki kualitas yang
baik dan tekstur yang tinggi. Pada eksperimen kedua bagian kedua ini, penulis
akan menggunakan citra stereo dengan nama Cones yang tertera pada Gambar 4.4.

Gambar 4.4 Citra Stereo Cones


Sumber: Middlebury Edu. Middlebury Stereo Datasets. Retrieved June 10, 2012, from
http://vision.middlebury.edu/stereo/

Universitas Indonesia

63

Untuk mencari citra disparity yang baik, penulis melakukan tuning pada
parameter BMState. Gambar beberapa variasi citra disparity Cones berdasarkan
tuning yang dilakukan tertera pada Gambar 4.5.

(a)

(b)

(c)
Gambar 4.5 (a) Citra Disparity Cones 1 (b) Citra Disparity Cones 2
(c) Citra Disparity Cones 3

Tuning

dilakukan

PreFilterCap,

pada

parameter

NumberOfDisparities,

BMState,
dan

yaitu,

SADWindowSize,

UniquenessRatio.

Sedangkan,

parameter-parameter yang lain ditetapkan pada kondisi default. Skema tuning


yang dilakukan pada eksperimen ini tertera pada tabel dibawah ini.
Tabel 4.2 Parameter-parameter BMState Dalam Citra Disparity Cones

Parameter BMState

Gambar 4.5 (a)

Gambar 4.5 (b)

Gambar 4.5 (c)

SADWindowSize

31

17

21

PrefilFilterCap

12

10

10

NumberOfDisparities

48

80

64

UniquenessRatio

11

12

Universitas Indonesia

64

Pada Gambar 4.5, terlihat bahwa citra disparity Cones yang terbentuk memiliki
kualitas yang cukup baik, terutama, citra disparity pada Gambar 4.5 (c). Citra
disparity terebut dikatakan baik karena representatif terhadap kedalaman objek,
walaupun, ada beberapa bentuk objek yang tidak terpetakan secara sempurna.
Citra disparity pada Gambar 4.5 (c) juga memiliki sedikit representasi warna
hitam, yang artinya, citra tersebut hanya sedikit memiliki titik yang informasi
kedalamannya

tidak

teregistrasi.

Eksperimen

kedua

bagian

kedua

ini

memperlihatkan dan mempertegas bahwa buruknya kualitas citra disparity yang


diperoleh pada eksperimen bagian sebelumnya ialah karena citra stereo tidak
memiliki kualitas yang baik, yaitu, citra tidak memiliki tekstur yang tinggi.

Walaupun kamera tidak bisa menghasilkan citra stereo dengan kualitas yang baik
yang berimplikasi pada buruknya citra disparity yang diperoleh, eksperimen untuk
melakukan rekonstruksi 3D objek akan tetap dilakukan. Eksperimen ini ditujukan
untuk menguji algoritma rekonstruksi 3D yang telah dikembangkan. Dalam
eksperimen kedua bagian ketiga ini, penulis akan merekonstruksi dua buah citra
stereo. Citra stereo yang pertama berasal dari kamera stereo yang telah dibuat
pada penelitian ini. Citra stereo yang kedua berasal dari Hamlyn Center
Laparoscopic/Endoscopic Video Datasets, yaitu, citra stereo jantung manusia.

Untuk rekonstruksi 3D citra stereo pertama, objek yang akan direkonstruksi


adalah citra lemari kayu. Citra stereo dari lemari kayu beserta citra disparity-nya
tertera pada Gambar 4.6.

(a)

Universitas Indonesia

65

(b)
Gambar 4.6 (a) Citra Stereo Lemari Kayu (b) Citra Disparity Lemari Kayu

Pada Gambar 4.6 (b), terlihat bahwa citra disparity dari lemari kayu tidak begitu
representatif terhadap kedalaman objek asli, bahkan, ada cukup banyak spot hitam
pada citra disparity. Walaupun sudah dilakukan tuning beberapa kali, namun citra
disparity yang memuaskan tidak kunjung didapatkan. Penyebabnya bisa
dipastikan tidak berbeda dengan percobaan sebelumnya, yaitu, tekstur pada citra
yang tidak begitu tinggi. Rekonstruksi 3D citra lemari kayu bisa dilihat pada
Gambar 4.7.

(a)

(b)

(c)

(d)

Gambar 4.7 (a) Citra 3D Lemari Kayu: Tampak Depan (b) Citra 3D Lemari Kayu: Tampak
bawah (c) Citra 3D Lemari Kayu: Tampak Kanan (d) Citra 3D Lemari Kayu: Tampak
Kiri

Universitas Indonesia

66

Pada Gambar 4.7, terlihat bahwa hasil dari rekonstruksi 3D masih jauh dari
sempurna. Hal itu sebagian besar dipengaruhi oleh buruknya citra disparity yang
didapat.

Untuk rekonstruksi 3D citra stereo kedua, seperti telah disebutkan sebelumnya,


objek yang akan direkonstruksi adalah jantung manusia. Citra tersebut berasal dari
endoskopi jantung manusia. Endoskopi adalah metode untuk melihat bagian
dalam tubuh manusia dengan menggunakan endoskop. Endoskop merupakan alat
kecil semacam kamera yang bertugas untuk mengambil citra dalam tubuh
manusia. Citra yang ditangkap oleh endoskop, tentu saja, merupakan citra dua
dimensi. Dalam beberapa kasus, citra dua dimensi tersebut tidak cukup
representatif dalam memberikan informasi. Oleh karena itu, penggunaan kamera
stereo dan proses rekonstruksi 3D terhadap objek yang didapat oleh endoskop bisa
menjadi solusi yang baik. Karena jika objek bisa tervisualisasi secara tiga dimensi,
gambaran tentang kondisi pasien bisa terlihat secara lebih komprehensif. Citra
stereo jantung bisa dilihat pada Gambar 4.8 dan citra disparity-nya bisa dilihat
pada gambar 4.9.

Gambar 4.8 Citra Stereo Jantung


Sumber: Imperial College London. Hamlyn Center Laparoscopic/Endoscopic Video Datasets.
http://hamlyn.doc.ic.ac.uk/vision.

Universitas Indonesia

67

Gambar 4.9 Citra Disparity Jantung

Dari citra disparity yang didapat, terlihat bahwa hasilnya cukup representatif
terhadap objek asli, walaupun, masih ada beberapa spot hitam di area pinggir
citra. Hal tersebut menandakan bahwa algoritma stereo-block matching tidak
terlalu bisa menemukan fitur yang bersesuaian pada daerah pinggir citra. Salah
satu penyebabnya bisa jadi karena tekstur citra yang kurang tinggi pada daerah
pinggir akibat kurangnya cahaya yang ada. Rekonstruksi 3D jantung bisa dilihat
pada gambar 4.10.

(a)

(b)

(c) (d)

Universitas Indonesia

68

(e) (f)
Gambar 4.10 (a) Citra 3D Jantung: Tampak Depan (Zoom-in) (b) Citra 3D Jantung:
Tampak Depan (Zoom-out) (c) Citra 3D Jantung: Tampak Miring (d) Citra 3D Jantung:
Tampak Kanan (e) Citra 3D Jantung: Tampak kiri (f) Citra 3D Jantung: Tampak Belakang

Pada Gambar 4.10, terlihat bahwa hasil dari rekonstruksi 3D sudah cukup baik.
Hal tersebut dikarenakan cukup baiknya citra disparity yang didapat dari citra
stereo jantung. Namun, pada bagian pinggir objek, masih terlihat serpihanserpihan objek yang tidak menyatu dengan bagian yang lain. Hal itu dikarenakan
ada beberapa spot hitam pada citra disparity objek, terutama pada bagian pinggir,
yang menyebabkan tidak teregistrasinya beberapa titik pada objek sehingga
beberapa bagian objek terlihat terpisah.

Universitas Indonesia

69

BAB 5
PENUTUP
Bab ini berisi kesimpulan penelitian serta saran bagi peneliti selanjutnya. Selain
itu, juga akan dipaparkan mengenai kendala yang dialami penulis semasa
melakukan penelitian.
5.1 Kesimpulan
Kesimpulan yang dapat diambil dari penelitian ini adalah:
1. Rekonstruksi 3D suatu objek sudah bisa dilakukan dengan menggunakan
kamera stereo walaupun dengan hasil yang tidak sempurna. Sebelum
digunakan untuk melakukan rekonstruksi, kamera stereo harus dikalibrasi
terlebih dahulu. Proses kalibrasi kamera stereo bisa dilakukan dengan fungsi
cvStereoCalibrate dalam library OpenCV.

2. Untuk melakukan rekonstruksi 3D, dibutuhkan citra disparity. Kualitas dari


citra disparity, salah satunya, ditentukan oleh jarak penempatan kamera kiri
dan kamera kanan. Dalam penelitian ini, citra disparity terbaik diperoleh jika
kamera kiri dan kamera kanan ditempatkan sejauh 10 cm.

3. Dalam melakukan kalibrasi kamera stereo, semakin banyak citra objek


kalibrasi stereo yang digunakan maka akan semakin mempertinggi kualitas dari
kamera stereo yang dihasilkan.

4. Baik atau tidaknya proses rekonstruksi 3D suatu objek, bergantung dari


kualitas citra disparity yang dihasilkan. Dalam penelitian ini, citra disparity
yang dihasilkan masih tergolong buruk, sehingga rekonstruksi 3D tidak bisa
dilakukan secara sempurna. Salah satu penyebab buruknya citra disparity ialah
karena tekstur pada citra yang dihasilkan kamera tidak begitu tajam.

69

Universitas Indonesia

70

5.2 Kendala
Kendala-kendala yang dihadapi penulis adalah:
1. Penulis belum familiar dengan program OpenCV dan PCL. Hal itu memaksa
penulis untuk mempelajari terlebih dahulu program-program tersebut sebelum
mengimplementasikan sistem.

1. Belum familiarnya penulis dengan program OpenCV dan PCL juga berakibat
pada kesulitan pada tahap instalasi program-program tersebut. Terlebih lagi,
awalnya, penulis mengembangkan sistem dalam OS Linux dimana ada
beberapa bagian dari tahapan instalasi yang harus dikerjakan secara manual.

2. Sebelum digunakan untuk mengimplementasi sistem, PCL dan programprogram lain yang terkait tersebut harus di-build terlebih dahulu. Untuk
melakukan hal itu, dibutuhkan build system CMake. Sebelumnya, penulis
belum begitu familiar dengan CMake, sehingga, penulis harus mempelajari
build system tersebut terlebih dahulu.

3. Saat mengimplementasi kamera stereo, penulis juga mengalami masalah.


Driver kamera pada linux (uvcdriver) memiliki batasan bandwidth saat
mengambil data dari protokol usb. Pada kamera tunggal, hal tersebut tidak
menjadi masalah yang cukup berarti karena data yang diambil dari protokol
usb masih dibawah ambang bandwidth yang diperbolehkan. Namun, saat
kamera stereo diaktivasi, uvcdriver menampilkan sinyal error. Untuk
mengatasi masalah tersebut, penulis mencoba untuk memperbaharui ucvdriver,
namun, tidak berhasil. Akhirnya, penulis memutuskan untuk membangun ulang
sistem dalam platform Windows dan melakukan instalasi ulang OpenCV dan
PCL.

4. Kendala lainnya ialah faktor lamanya waktu compiling. Hal itu disebabkan
karena sistem melibatkan library OpenCV dan PCL.

Universitas Indonesia

71

5.3 Saran
Saran-saran dari penulis untuk penelitian selanjutnya adalah:
1.

Sistem ini melakukan rekonstruksi 3D hanya dari satu sisi saja. Oleh karena
itu, kedepannya, penulis berharap sistem rekonstruksi 3D ini bisa
dikembangkan sehingga objek bisa direkonstruksi secara utuh dari seluruh
sisi. Hal tersebut bisa dilakukan dengan menggunakan lebih dari satu kamera
stereo yang digunakan untuk menyorot objek dari berbagai sisi.

2.

Penulis berharap penelitian selanjutnya dapat membuat sistem rekonstruksi


3D suatu objek secara real-time.

3.

Penelitian selanjutnya juga diharapkan dapat melakukan perbaikan terhadap


citra 3D yang diperoleh. Hal itu dikarenakan citra 3D yang didapat dari
proses rekonstruksi bisa dipastikan tidak sempurna akibat noise.

Universitas Indonesia

72

DAFTAR PUSTAKA

[1]

Bradski, G., & Kaehler, A. (2008). Learning OpenCV Computer Vision with
the OpenCV Library. O'Reilly Media.

[2]

Cry Engine Documentation. Photobump Guide. Retrieved Mei 15, 2012,


from http://freesdk.crydev.net/display/SDKDOC3/Photobump.

[3]

Faugeras, O. (1996). Three-Dimensional Computer Vision: A Geometric


Approach. MIT Press.

[4]

Forsyth, D. A., & Ponce, J. (2002). Computer Vision: A Modern Approach.


New Jersey: Prentice Hall.

[5]

GIMP. (2010, November). GIMP Documentation.

[6]

Gonzalez, R. C., & Woods, R. E. (2007). Digital Image Processing. New


Jersey: Prentice Hall.

[7]

Harley, R., & Zisserman, A. (2000). Multiple View Geometry in Computer


Vision. Cambridge University Press.

[8]

Imperial College London. Hamlyn Center Laparoscopic/Endoscopic Video


Datasets. http://hamlyn.doc.ic.ac.uk/vision.

[9]

Laganire,

R.

(2011).

OpenCV

Computer

Vision

Application

Programming Cookbook. Birmingham: Packt Publishing.


[10] Lindsay, P. H., & Norman, D. A. (1977). An Introduction to Psychology.
Academic Press Inc.
[11] Middlebury Edu. Middlebury Stereo Datasets. Retrieved June 10, 2012,
from http://vision.middlebury.edu/stereo/
[12] OpenCV. (2011, August). OpenCV Reference Manual 2.3.

Universitas Indonesia

73

[13] Peris,

M. (2011, January). OpenCV: Stereo Camera Calibration.

http://blog.martinperis.com/2011/01/opencv-stereo-camera-calibration.html.
[14] Saphiro, L. G., & Stockman, G. C. (2001). Computer Vision. New Jersey:
Prentice Hall.
[15] Scharstein, D., & Szeliski, R. (2002). A Taxonomy and Evaluation of
Dense Two-Frame Stereo Correspondence Algorithms. International
Journal of Computer Vision, 47(1/2/3):7-42.
[16] Statistics Glosary. Presenting Data. Retrieved April 20, 2012, from
http://www.stats.gla.ac.uk/steps/glossary/presenting_data.html.
[17] Tsai, R., Y. (1987, August). A Versatile Camera Calibration Technique for
3D Machine Vision. IEEE J. Robotics & Automation, RA-3, No. 4, (pp.
323-344).
[18] Zang, Z. (2000). A Flexible New Technique for Camera Calibration. IEEE
Transactions on Pattern Analysis and Machine Intelligence, 22 (11), 13301334.

Universitas Indonesia

74

LAMPIRAN 1. Kode Program Utama

#include <cv.h>
#include <highgui.h>
#include <cxmisc.h>
#include <cvaux.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <ctype.h>
#include <algorithm>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include "boost/thread/thread.hpp"
#include <opencv2/core/core.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/contrib/contrib.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <new>

using namespace cv;


using namespace std;

//Prototype fungsi untuk koleksi citra stereo

Universitas Indonesia

75

void koleksiCitraStereo(void);
void tampilkan(Mat, string);
void potretStereo(Mat, Mat, int, string);
void buatList(int);
void tampilkanStereo(Mat, Mat, CvSize, string);
void kalibrasiStereo(char*, int, int, float);
void simpanGambar(IplImage*, string);
void simpanGambar(CvMat*, string);
void rekonstruksi3D(int);
void rekonstruksi3D(Mat, Mat);
void rekonstruksi_objek();
void mouseHandler(int , int , int , int, void*);
boost::shared_ptr<pcl::visualization::PCLVisualizer>
createVisualizer (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr);

Mat frame, frame1, frame2, frame_gabungan;


CvCapture *capture, *capture1, *capture2;

double** depth;
RNG rng(12345);

int counter;

int main(int args, char** argv) {


char c;
cout << "masukkan mode : ";
cin >> c;
if (c == '1') koleksiCitraStereo();
if (c == '2' ) kalibrasiStereo("data/list.txt", 9, 6, 2.8);
if (c == '3') rekonstruksi_objek();

Universitas Indonesia

76

return 0;
}

void koleksiCitraStereo() {
counter = 0;

//Menangkap gambar dari webcam


capture1 = cvCreateCameraCapture(1);
capture2 = cvCreateCameraCapture(2);
//Setting properti tinggi dan lebar
cvSetCaptureProperty( capture1, CV_CAP_PROP_FRAME_WIDTH, 640 );
cvSetCaptureProperty( capture1, CV_CAP_PROP_FRAME_HEIGHT, 480 );
cvSetCaptureProperty( capture2, CV_CAP_PROP_FRAME_WIDTH, 640 );
cvSetCaptureProperty( capture2, CV_CAP_PROP_FRAME_HEIGHT, 480 );

while (true) {

//Menangkap frame dari kamera untuk ditampilkan


frame1 = cvQueryFrame(capture1);
frame2 = cvQueryFrame(capture2);

//Jika Frame Kosong jangan ditampilkan


if (!frame1.empty() && !frame2.empty()){
//fungsi untuk menampilkan gambar stereo
tampilkanStereo(frame1, frame2, frame1.size(), "Kamera Stereo");
}
else {
printf("TIDAK ADA GAMBAR YANG DIDAPAT!");
exit(-1);
}

Universitas Indonesia

77

char c = cvWaitKey(33);

//Tekan karakter 'a' untuk menyimpan gambar


if (c == 'a') {
potretStereo(frame1, frame2, ++counter, "data/citra_untuk_kalibrasi_stereo");
}

//Tekan karakter 's' untuk keluar


if (c == 's') {
cvReleaseCapture(&capture);
frame1.release();
frame2.release();
buatList(counter);
cvDestroyWindow("Kamera Stereo");
return;
}

//escape untuk cancel


if (c == 27) {
cvReleaseCapture(&capture);
frame1.release();
frame2.release();
break;
}
}
}

//Fungsi untuk menyimpan gambar yang didapat dari kamera


//Gambar disimpan dengan tipe .ppm
void potretStereo(Mat frame1, Mat frame2,int counter, string nama) {

stringstream namaFile;

Universitas Indonesia

78

//tipe kompresi portable pixel map (.ppm)


vector<int> tipe_kompresi;
tipe_kompresi.push_back(CV_IMWRITE_PXM_BINARY);
tipe_kompresi.push_back(1);
namaFile << nama << "/kiri_" << counter << ".ppm";
imwrite(namaFile.str(), frame1, tipe_kompresi);
namaFile.str("");
namaFile << nama << "/kanan_" << counter << ".ppm";
imwrite(namaFile.str(), frame2, tipe_kompresi);

//Fungsi untuk menyimpan nama file gambar yang telah dibuat


//List nama file ditulis dalam file list.txt
void buatList(int counter) {
int i;
ofstream file;
stringstream filename;
remove("data/list.txt");
file.open("data/list.txt");
if (counter > 0) {
for (i = 0; i < counter; i++) {
filename << "data/citra_untuk_kalibrasi_stereo/kiri_"
<< (i + 1) << ".ppm" << "\n" <<
"data/citra_untuk_kalibrasi_stereo/kanan_"
<< (i + 1) << ".ppm" << "\n";
}

file << filename.str();


}
file.close();
cout << "list file sudah ditulis dalam data/list.txt";

Universitas Indonesia

79

//fungsi untuk menampilkan gambar secara stereo


void tampilkanStereo(Mat frame1, Mat frame2, CvSize ukuran, string nama){
Mat roi;
Mat mask (ukuran, CV_8UC1);
//frame gabungan untuk menyatukan citra kanan dan kiri
Mat frame_gabungan =
Mat(Size(frame1.cols*2,frame1.rows),CV_8UC3);
mask.setTo(255);
Point p1(0,0), p2(frame1.cols,0);
//region of interest kamera kiri, menginisiasi header
roi = Mat (frame_gabungan, Rect(p1,frame1.size()));
frame1.copyTo(roi, mask);
//region of interest kamera kiri, menginisiasi header
roi = Mat (frame_gabungan, Rect(p2,frame2.size()));
frame2.copyTo(roi, mask);
tampilkan(frame_gabungan, nama);
}

//Fungsi untuk menampilkan Mat


void tampilkan(Mat frame, string nama) {
cvNamedWindow(nama.c_str(), CV_WINDOW_AUTOSIZE);
imshow(nama, frame);
}

//fungsi untuk melakukan kalibrasi kamera stereo


//input dari fungsi adalah nama file citra kalibrasi stereo,
//banyak sudut internal vertikal dan horizontal,
//dan ukuran kotak
void kalibrasiStereo(char* daftarFile, int nx, int ny, float ukuranKotak) {

Universitas Indonesia

80

const int skalaMaksimum = 1;


bool stereoVertikal = false;
FILE* file = fopen(daftarFile, "rt");
stringstream tulis_file;
ofstream buat_file;

vector<string> namaImage[2]; //nama-nama citra objek kalibrasi


vector<CvPoint3D32f> koordinatObjek3D; //koordinat objek asli 3D
vector<CvPoint2D32f> koordinatObjek2D[2]; //koordinat objek dalam citra 2D
vector<uchar> aktif[2];//tempat menyimpan titik-titik yang baik
vector<int> nTitik;
int n = nx * ny, N = 0, n_image;
vector<CvPoint2D32f> temp(n); //penyimpanan piksel sementara
int i, j, posisiKamera;
CvSize ukuranImage = { 0, 0 };

//Matriks-matriks yang dihasilkan dari proses kalibrasi stereo


double M_ki[3][3], M_ka[3][3], D_ki[5], D_ka[5], Ro[3][3], Tr[3], Es[3][3],
Fu[3][3], Q_[4][4];
CvMat M_kiri = cvMat(3, 3, CV_64F, M_ki); //matriks M kamera kiri
CvMat M_kanan = cvMat(3, 3, CV_64F, M_ka); //Matriks M kamera kanan
CvMat D_kiri = cvMat(1, 5, CV_64F, D_ki); //vektor distorsi kamera kiri
CvMat D_kanan = cvMat(1, 5, CV_64F, D_ka); //vektor distorsi kamera kanan
CvMat R = cvMat(3, 3, CV_64F, Ro); //matriks rotasi
CvMat T = cvMat(3, 1, CV_64F, Tr); //matriks Translasi
CvMat E = cvMat(3, 3, CV_64F, Es); //matriks essensial
CvMat F = cvMat(3, 3, CV_64F, Fu); //matriks fundamental
CvMat Q = cvMat(4, 4, CV_64F, Q_); //matriks Q

if (!file) {

Universitas Indonesia

81

fprintf(stderr, "file tidak bisa dibuka :%s\n", daftarFile);


return;
}

for (i = 0;; i++) {


char buf[1024]; //buffer untuk menyimpan teks sementara dari file
int hasil = 0, count = 0;
posisiKamera = i % 2; //posisi kamera (kanan atau kiri)
vector<CvPoint2D32f>& koor = koordinatObjek2D[posisiKamera];
if (!fgets(buf, sizeof(buf) - 3, file))
break; //mengambil daftar gambar dari file
size_t len = strlen(buf);
while (len > 0 && isspace(buf[len - 1])) buf[--len] = '\0';
if (buf[0] == '#') continue;
IplImage* image = cvLoadImage(buf, 0);

if (!image) break;
ukuranImage = cvGetSize(image);
namaImage[posisiKamera].push_back(buf);
//pencarian sudut catur
for (int s = 1; s <= skalaMaksimum; s++) {
IplImage* temp_image = image;
if (s > 1) {
//resize temp_image agar seukuran dengan image
//bicubic interpolasi 4x4
temp_image = cvCreateImage(cvSize(image->width * s,
image->height * s), image->depth, image->nChannels);
cvResize(image, temp_image, CV_INTER_CUBIC);
}

//mencari sudut internal dari papan catur

Universitas Indonesia

82

//mengembalikan nilai bukan nol bila berhasil menemukan sudut

hasil = cvFindChessboardCorners(temp_image, cvSize(nx, ny),


&temp[0], &count, CV_CALIB_CB_ADAPTIVE_THRESH
|CV_CALIB_CB_NORMALIZE_IMAGE);

if (temp_image != image)
cvReleaseImage(&temp_image);

if (hasil || s == skalaMaksimum) {
for (j = 0; j < count; j++) {
temp[j].x /= s;
temp[j].y /= s;
}
}

if (hasil)
break;

//Membuat file gambar sudut-sudut papan catur


printf("%s\n", buf);
//membuat image baru
IplImage* sudutImage = cvCreateImage(ukuranImage, 8, 3);
cvCvtColor(image, sudutImage, CV_GRAY2BGR);
cvDrawChessboardCorners(sudutImage, cvSize(nx, ny), &temp[0], count,
hasil);

tulis_file.str("");
//di kanan
if (posisiKamera == 0) {

Universitas Indonesia

83

tulis_file << "data/citra_hasil_kalibrasi_stereo/sudut/citra_kanan_"

<< ((i / 2) + posisiKamera) + 1 << ".ppm";


}
//di kiri
else {
tulis_file << "data/citra_hasil_kalibrasi_stereo/sudut/citra_kiri_"
<< ((i / 2) + posisiKamera) << ".ppm";
}

simpanGambar(sudutImage, tulis_file.str());

N = koor.size();
koor.resize(N + n, cvPoint2D32f(0, 0));
aktif[posisiKamera].push_back((uchar) hasil);

if (hasil) {
//fungsi untuk menemukan sudut internal dalam papan catur
cvFindCornerSubPix(image, &temp[0],
count, cvSize(11, 11),
cvSize(-1, -1), cvTermCriteria(CV_TERMCRIT_ITER +
CV_TERMCRIT_EPS, 30, 0.01));
copy(temp.begin(), temp.end(), koor.begin() + N);

cvReleaseImage(&image);
}

fclose(file);

//papan catur yang terdeteks baik

Universitas Indonesia

84

n_image = aktif[0].size();
koordinatObjek3D.resize(n * n_image);
for (i = 0; i < ny; i++) {
for (j = 0; j < nx; j++) {
koordinatObjek3D[i * nx + j] =
cvPoint3D32f(i * ukuranKotak, j * ukuranKotak, 0);
}
}

for (i = 1; i < n_image; i++) {


copy(koordinatObjek3D.begin(), koordinatObjek3D.begin() + n,
koordinatObjek3D.begin() + i * n);
}
nTitik.resize(n_image, n);
N = n * n_image;

//penyimpanan koordinat fisik objek


CvMat koordinatObjek = cvMat(1, N, CV_32FC3, &koordinatObjek3D[0]);
//koordinat objek dari kamera kiri
CvMat koordinatObjek_kiri = cvMat(1, N, CV_32FC2,
&koordinatObjek2D[0][0]);
//koordinat objek dari kamera kanan
CvMat koordinatObjek_kanan = cvMat(1, N, CV_32FC2,
&koordinatObjek2D[1][0]);
CvMat banyakTitik = cvMat(1, nTitik.size(), CV_32S, &nTitik[0]);

cvSetIdentity(&M_kiri);
cvSetIdentity(&M_kanan);
cvZero(&D_kiri);
cvZero(&D_kanan);

Universitas Indonesia

85

//PROSES KALIBRASI
printf("proses kalibrasi stereo\n\n");
fflush(stdout);

cvStereoCalibrate(&koordinatObjek, &koordinatObjek_kiri,
&koordinatObjek_kanan, &banyakTitik, &M_kiri, &D_kiri, &M_kanan,
&D_kanan, ukuranImage, &R, &T, &E, &F, cvTermCriteria(
CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 100, 1e-5),
CV_CALIB_FIX_ASPECT_RATIO +
CV_CALIB_ZERO_TANGENT_DIST+
CV_CALIB_SAME_FOCAL_LENGTH );

//QUALITY CHECK
//garis epipolar kamera kiri dan kanan
vector<CvPoint3D32f> garis[2];
koordinatObjek2D[0].resize(N);
koordinatObjek2D[1].resize(N);
koordinatObjek_kiri = cvMat(1, N, CV_32FC2, &koordinatObjek2D[0][0]);
koordinatObjek_kanan = cvMat(1, N, CV_32FC2, &koordinatObjek2D[1][0]);
garis[0].resize(N);
garis[1].resize(N);
CvMat G_1 = cvMat(1, N, CV_32FC3, &garis[0][0]);
CvMat G_2 = cvMat(1, N, CV_32FC3, &garis[1][0]);

cvUndistortPoints(&koordinatObjek_kiri, &koordinatObjek_kiri, &M_kiri,


&D_kiri, 0, &M_kiri);
cvUndistortPoints(&koordinatObjek_kanan, &koordinatObjek_kanan,
&M_kanan, &D_kanan, 0, &M_kanan);

Universitas Indonesia

86

//mencari koefisien-koefisien garis epipolar


cvComputeCorrespondEpilines(&koordinatObjek_kiri, 1, &F, &G_1);
cvComputeCorrespondEpilines(&koordinatObjek_kanan, 2, &F, &G_2);

//Perhitungan nilai error


remove("data/kalkulasi_error.txt");
buat_file.open("data/kalkulasi_error.txt");
tulis_file.str("");
double error = 0;
for (i = 0; i < N; i++) {
double tempError = (double)fabs((double)((garis[1][i].x *
koordinatObjek2D[0][i].x
garis[1][i].z)))

garis[1][i].y
(double)

koordinatObjek2D[1][i].x + garis[0][i].y

koordinatObjek2D[0][i].y

fabs((double)((garis[0][i].x
*

koordinatObjek2D[1][i].y

+
*
+

garis[0][i].z)));

tulis_file << "error ke " << i << " = " << tempError << "\n";
error += tempError;

}
double rataan_error = error/ (n_image *n);

tulis_file << "\nerror rata-rata = " << rataan_error;


buat_file << tulis_file.str();
cout << "\nerror rata-rata = " << rataan_error << endl;

buat_file.close();

//REKTIFIKASI STEREO

Universitas Indonesia

87

CvMat*

mx_kiri

cvCreateMat(ukuranImage.height,

ukuranImage.width,

my_kiri

cvCreateMat(ukuranImage.height,

ukuranImage.width,

CV_32F );
CvMat*
CV_32F );
CvMat* mx_kanan = cvCreateMat(ukuranImage.height, ukuranImage.width,
CV_32F );
CvMat* my_kanan = cvCreateMat(ukuranImage.height, ukuranImage.width,
CV_32F );
CvMat* img_kiri = cvCreateMat(ukuranImage.height, ukuranImage.width,
CV_8U );
CvMat* img_kanan = cvCreateMat(ukuranImage.height,

ukuranImage.width,

CV_8U );
CvMat* disp = cvCreateMat(ukuranImage.height, ukuranImage.width, CV_16S );
CvMat* vdisp = cvCreateMat(ukuranImage.height, ukuranImage.width, CV_8U );
CvMat* pair;

//Rectification dengan Metode Bouguets


double R_ki[3][3], R_ka[3][3], P_ki[3][4], P_ka[3][4];
CvMat R_kiri = cvMat(3, 3, CV_64F, R_ki);
CvMat R_kanan = cvMat(3, 3, CV_64F, R_ka);

CvMat P_kiri = cvMat(3, 4, CV_64F, P_ki);


CvMat P_kanan = cvMat(3, 4, CV_64F, P_ka);
cvStereoRectify(&M_kiri,

&M_kanan,

&D_kiri,

&D_kanan,

ukuranImage, &R, &T, &R_kiri, &R_kanan, &P_kiri, &P_kanan, &Q, 0);

stereoVertikal = (int)fabs((double)(P_ka[1][3] > P_ki[0][3]));


cvInitUndistortRectifyMap(&M_kiri,

&D_kiri,

&R_kiri,

&P_kiri,

mx_kiri,my_kiri);
cvInitUndistortRectifyMap(&M_kanan,

&D_kanan,

&R_kanan,

&P_kanan, mx_kanan, my_kanan);

Universitas Indonesia

88

//Simpan parameter-parameter
//Matriks M
cvSave("data/matriks/M_kiri.xml", &M_kiri);
cvSave("data/matriks/M_kanan.xml", &M_kanan);
//Distortion Vector
cvSave("data/matriks/D_kiri.xml", &D_kiri);
cvSave("data/matriks/D_kanan.xml", &D_kanan);
//matriks Rotasi
cvSave("data/matriks/R_kiri.xml", &R_kiri);
cvSave("data/matriks/R_kanan.xml", &R_kanan);
//Matriks P
cvSave("data/matriks/P_kiri.xml", &P_kiri);
cvSave("data/matriks/P_kanan.xml", &P_kanan);
//Matriks Q
cvSave("data/matriks/Q.xml", &Q);

cvSave("data/matriks/mx_kiri.xml", mx_kiri);
cvSave("data/matriks/my_kiri.xml", my_kiri);
cvSave("data/matriks/mx_kanan.xml", mx_kanan);
cvSave("data/matriks/my_kanan.xml", my_kanan);

//cvNamedWindow("rectified",1);
if (!stereoVertikal)
pair = cvCreateMat(ukuranImage.height, ukuranImage.width * 2,
CV_8UC3 );
else
pair = cvCreateMat(ukuranImage.height * 2, ukuranImage.width,
CV_8UC3 );

//KORESPONDENSI STEREO

Universitas Indonesia

89

//Parameter BMState
CvStereoBMState *BMState = cvCreateStereoBMState();
assert(BMState != 0);
BMState->preFilterSize = 41; //41
BMState->preFilterCap = 31; //31
BMState->SADWindowSize = 41; //41
BMState->minDisparity = -64; //-64
BMState->numberOfDisparities = 128; //128
BMState->textureThreshold = 10; //10
BMState->uniquenessRatio = 15; //15

for (i = 0; i < n_image; i++) {


IplImage *temp, temp_header;
IplImage* image_kiri = cvLoadImage(namaImage[0][i].c_str(), 0);
IplImage* image_kanan = cvLoadImage(namaImage[1][i].c_str(),
0);
if (image_kiri && image_kanan) {
CvMat part;
cvRemap(image_kiri, img_kiri, mx_kiri, my_kiri);
cvRemap(image_kanan, img_kanan, mx_kanan,
my_kanan);
if (!stereoVertikal) {
//Pencarian citra disparity
cvFindStereoCorrespondenceBM(img_kiri,
img_kanan, disp, BMState);
cvNormalize(disp, vdisp, 0, 256, CV_MINMAX);
tulis_file.str("");
tulis_file <<
"data/citra_hasil_kalibrasi_stereo/disparity/citra_"
<< (i + 1) << ".pgm";
//menyimpan citra disparity

Universitas Indonesia

90

simpanGambar(vdisp, tulis_file.str());
cvGetCols(pair, &part, 0, ukuranImage.width);
cvCvtColor(img_kiri, &part, CV_GRAY2BGR);
cvGetCols(pair, &part, ukuranImage.width,
ukuranImage.width * 2);
cvCvtColor(img_kanan, &part, CV_GRAY2BGR);

for (j = 0; j < ukuranImage.height; j += 16) {


cvLine(pair, cvPoint(0, j),
cvPoint(ukuranImage.width * 2,
j), CV_RGB(0,255,0));
}

} else {
cvGetRows(pair, &part, 0, ukuranImage.height);
cvCvtColor(img_kanan, &part, CV_GRAY2BGR);
cvGetRows(pair, &part, ukuranImage.height,
ukuranImage.height* 2);
cvCvtColor(img_kanan, &part, CV_GRAY2BGR);
for (j = 0; j < ukuranImage.width; j += 16)
cvLine(pair, cvPoint(j, 0), cvPoint(j,
ukuranImage.height* 2),
CV_RGB(0,255,0));
}

tulis_file.str("");
tulis_file
<<
"data/citra_hasil_kalibrasi_stereo/penyerasian_baris/citra_"
<< (i + 1) << ".ppm";
simpanGambar(pair, tulis_file.str());
}

Universitas Indonesia

91

cvReleaseImage(&image_kiri);
cvReleaseImage(&image_kanan);
}

cvReleaseStereoBMState(&BMState);
cvReleaseMat(&mx_kiri);
cvReleaseMat(&my_kiri);
cvReleaseMat(&mx_kanan);
cvReleaseMat(&my_kanan);
cvReleaseMat(&img_kiri);
cvReleaseMat(&img_kanan);
cvReleaseMat(&disp);

cout << "abis deh" << endl;

//fungsi untuk menyimpan gambar bertipe IplImage


void simpanGambar(IplImage* gambar, string namafile) {
Mat temp(gambar);
vector<int> tipeKompresi;
tipeKompresi.push_back(CV_IMWRITE_PXM_BINARY);
tipeKompresi.push_back(1);
imwrite(namafile, temp, tipeKompresi);
}

//fungsi untuk menyimpan gambar bertipe CvMatt


void simpanGambar(CvMat* gambar, string namafile) {
Mat temp(gambar);
vector<int> tipeKompresi;
tipeKompresi.push_back(CV_IMWRITE_PXM_BINARY);

Universitas Indonesia

92

tipeKompresi.push_back(1);
imwrite(namafile, temp, tipeKompresi);
}

//fungsi untuk membuat citra disparit


void buatCitraDisparity(Mat frame1, Mat frame2, int counter){
cout << "disp starts" << endl;
Mat citraDisparity;
cvtColor(frame1, citraDisparity, CV_RGB2GRAY);
stringstream namaFile;
vector<int> tipe_kompresi;
tipe_kompresi.push_back(CV_IMWRITE_PXM_BINARY);
tipe_kompresi.push_back(1);

Mat temp_kiri (frame1.size(), CV_8U);


Mat temp_kanan (frame2.size(), CV_8U);
Mat temp_disp (citraDisparity.size(), CV_16S);

Mat mx_kiri, my_kiri, mx_kanan, my_kanan;

//Mengambil map
FileStorage f_mx_kiri("data/matriks/mx_kiri.xml", cv::FileStorage::READ);
FileStorage f_my_kiri("data/matriks/my_kiri.xml", cv::FileStorage::READ);
FileStorage f_mx_kanan("data/matriks/mx_kanan.xml", cv::FileStorage::READ);
FileStorage f_my_kanan("data/matriks/my_kanan.xml", cv::FileStorage::READ);

f_mx_kiri["mx_kiri"] >> mx_kiri;


f_my_kiri["my_kiri"] >> my_kiri;
f_mx_kanan["mx_kanan"] >> mx_kanan;

Universitas Indonesia

93

f_my_kanan["my_kanan"] >> my_kanan;

f_mx_kiri.release();
f_my_kiri.release();
f_mx_kanan.release();
f_my_kanan.release();
cout << "disp ends" << endl;

CvStereoBMState *BMState = cvCreateStereoBMState();


assert(BMState != 0);
BMState->preFilterSize = 41; //41
BMState->preFilterCap = 50; //31
BMState->SADWindowSize = 35; //41
BMState->minDisparity = -64; //-64
BMState->numberOfDisparities = 128; //128
BMState->textureThreshold = 10; //10
BMState->uniquenessRatio = 15; //15

//undistorted in temp_kiri and temp_kanan

cout << "disp starts" << endl;


cout << "disp starts 1" << endl;
remap(frame1, temp_kiri, mx_kiri, my_kiri, INTER_LINEAR);
remap(frame2, temp_kanan, mx_kanan, my_kanan, INTER_LINEAR);
cout << "disp starts 2" << endl;
CvMat t_kiri = temp_kiri;
CvMat t_kanan = temp_kanan;
cout << "disp starts 3" << endl;
CvMat*

citra_kiri

cvCreateMat(temp_kiri.rows,

temp_kiri.cols,

CV_8U);
CvMat* citra_kanan = cvCreateMat(temp_kanan.rows, temp_kanan.cols,
CV_8U);

Universitas Indonesia

94

CvMat* citra_disp = cvCreateMat(temp_disp.rows, temp_disp.cols,


CV_16S);
cout << "disp starts 4" << endl;
cvConvertImage(&t_kiri, citra_kiri, 0);
cvConvertImage(&t_kanan, citra_kanan, 0);
cout << "disp starts 5" << endl;
cvFindStereoCorrespondenceBM(citra_kiri,

citra_kanan,

citra_disp,

BMState);
temp_disp.release();
temp_disp = cvarrToMat (citra_disp);
normalize(temp_disp, citraDisparity, 0, 256, CV_MINMAX);
cout << "disp ends" << endl;
namaFile << "data/citra_wajah_terproses/disparity/citra_" << counter <<
".pgm";
imwrite(namaFile.str(), citraDisparity, tipe_kompresi);

while (true) {
cvNamedWindow("citra_kiri");
cvShowImage("citra_kiri", citra_kiri);
cvNamedWindow("citra_kanan");
cvShowImage("citra_kanan", citra_kanan);
cvNamedWindow("citra_disp");
cvShowImage("citra_disp", citra_disp);
imshow("temp_disp", temp_disp);
imshow("citraDisparity", citraDisparity);

char cc = cvWaitKey(33);
if (cc == 27){
cvDestroyWindow("citra_kiri");
cvDestroyWindow("citra_kanan");
cvDestroyWindow("citra_disp");
cvDestroyWindow("temp_disp");

Universitas Indonesia

95

cvDestroyWindow("citraDisparity");
break;
}
}

temp_kiri.release();
temp_kanan.release();
temp_disp.release();
citraDisparity.release();
}

//Fungsi ini melakukan rekonstruksi3D objek


//Sebelum melakukan rekonstruksi fungsi dapae melakukan
//tuning parameter BM
//Tuning digunakan dengan input keyboard
void rekonstruksi_objek() {
int counter = 0;

//Matriks parameter Q
Mat Q;
//Rectification Map
Mat mx_kiri, my_kiri, mx_kanan, my_kanan;

//Mengambil matriks Q dan Map dari berkas xml


FileStorage f_Q("data/matriks/Q.xml", cv::FileStorage::READ);
FileStorage f_mx_kiri("data/matriks/mx_kiri.xml", cv::FileStorage::READ);
FileStorage f_my_kiri("data/matriks/my_kiri.xml", cv::FileStorage::READ);
FileStorage f_mx_kanan("data/matriks/mx_kanan.xml", cv::FileStorage::READ);
FileStorage f_my_kanan("data/matriks/my_kanan.xml", cv::FileStorage::READ);

f_Q["Q"] >> Q;

Universitas Indonesia

96

f_mx_kiri["mx_kiri"] >> mx_kiri;


f_my_kiri["my_kiri"] >> my_kiri;
f_mx_kanan["mx_kanan"] >> mx_kanan;
f_my_kanan["my_kanan"] >> my_kanan;

f_Q.release();
f_mx_kiri.release();
f_my_kiri.release();
f_mx_kanan.release();
f_my_kanan.release();

//Menangkap gambar dari kamera


capture1 = cvCreateCameraCapture(1);
capture2 = cvCreateCameraCapture(2);
cvSetCaptureProperty( capture1, CV_CAP_PROP_FRAME_WIDTH, 640 );
cvSetCaptureProperty( capture1, CV_CAP_PROP_FRAME_HEIGHT, 480 );
cvSetCaptureProperty( capture2, CV_CAP_PROP_FRAME_WIDTH, 640 );
cvSetCaptureProperty( capture2, CV_CAP_PROP_FRAME_HEIGHT, 480 );

//Set parameter BM
int minDisparity=0;
int ndisparities = 5*16;
int SADWindowSize = 17;
int preFilterCap=10;
int uniquenessRatio=12;
int P1=0, P2=0;
int speckleWindowSize=0;
int speckleRange=0;
int disp12MaxDiff=0;
bool fullDP=false;

Universitas Indonesia

97

while (true) {

frame1 = cvQueryFrame(capture1);
frame2 = cvQueryFrame(capture2);

char in = cvWaitKey(33);

if (!frame1.empty() && !frame2.empty()){


tampilkanStereo(frame1, frame2, frame1.size(), "Kamera
Stereo");
}
else {
printf("TIDAK ADA GAMBAR YANG DIDAPAT!");
exit(-1);
}

//Tekan karakter 'a' untuk melakukan rekonstruksi objek


if (in == 'a') {
counter++;
int banyakWajah = 0;

cvDestroyWindow("Kamera Stereo");

//Pencarian citra disparity


Mat citraDisparity;
Mat temp_kiri (frame1.size(), CV_8UC1);
Mat temp_kanan (frame2.size(), CV_8UC1);
Mat citra_kiri (frame1.size(), CV_8UC3);
Mat citra_kanan (frame2.size(), CV_8UC3);
Mat temp_disp16S (frame1.size(), CV_16S);

Universitas Indonesia

98

Mat temp_disp8U (frame1.size(), CV_8UC1);

remap(frame1, temp_kiri, mx_kiri, my_kiri, INTER_LINEAR);


remap(frame2, temp_kanan, mx_kanan, my_kanan, INTER_LINEAR);
cvtColor(temp_kiri, temp_kiri, CV_RGB2GRAY);
cvtColor(temp_kanan, temp_kanan, CV_RGB2GRAY);

remap(frame1, citra_kiri, mx_kiri, my_kiri, INTER_LINEAR);


remap(frame2, citra_kanan, mx_kanan, my_kanan, INTER_LINEAR);

StereoSGBM SGBM(minDisparity, ndisparities, SADWindowSize, P1,P2,


disp12MaxDiff, preFilterCap, uniquenessRatio,
speckleWindowSize, speckleRange, fullDP);
SGBM(temp_kiri, temp_kanan, temp_disp16S);
double nilaiMin, nilaiMax;
minMaxLoc(temp_disp16S, &nilaiMin, &nilaiMax);
temp_disp16S.convertTo(temp_disp8U,

CV_8UC1,

255/(nilaiMax-nilaiMin));

namedWindow( "windowDisparity", CV_WINDOW_AUTOSIZE );


bool flag = false;
while (true){
//Fase TUNING StereoBM Parameter
//
char c = cvWaitKey(33);
imshow( "windowDisparity", temp_disp8U );

//Parameter SAD
if (c== 'p')
{ SADWindowSize += 2; cout << "SAD Window Size = " << SADWindowSize
<< endl; flag = true; }
if (c== 'o')

Universitas Indonesia

99

{SADWindowSize -= 2; cout << "SAD Window Size = " << SADWindowSize


<< endl; flag = true;}
//Parameter ndisparities
if (c== 'i')
{ ndisparities += 16; cout << "ndisparities = " << ndisparities << endl; flag =
true; }
if (c== 'u')
{ndisparities -= 16; cout << "ndisparities = " << ndisparities << endl; flag = true;
}
//parameter minDIsparity
if (c== 'y')
{ cout << "minDisparity = " << ++minDisparity << endl; flag = true;}
if (c== 't')
{ cout << "minDisparity = " << --minDisparity << endl; flag = true;}
//parameter preFilterCap
if (c== 'r')
{ cout << "preFilterCap = " << ++preFilterCap << endl; flag = true; }
if (c== 'e'){ cout << "preFilterCap = " << --preFilterCap << endl; flag = true;}
//parameter uniquenessRation
if (c== 'w') { cout << "uniquenessRatio = " << ++uniquenessRatio << endl; flag
= true;}
if (c== 'q'){ cout << "uniquenessRatio = " << --uniquenessRatio << endl; flag =
true;}
//parameter speckleWindowSize
if (c== 'l') { cout << "speckleWindowSize = " << ++speckleWindowSize <<
endl; flag = true;}
if (c== 'k'){ cout << "speckleWindowSize = " << --speckleWindowSize << endl;
flag = true;}
//parameter speckeRange
if (c== 'j') { cout << "speckleRange = " << ++speckleRange << endl; flag =
true;}
if (c== 'h'){ cout << "speckleRange = " << --speckleRange << endl; flag = true;}

Universitas Indonesia

100

//parameter disp12MaxDiff
if (c== 'g') { cout << "disp12MaxDiff = " << ++disp12MaxDiff << endl; flag =
true;}
if (c== 'f'){ cout << "disp12MaxDiff = " << --disp12MaxDiff << endl; flag =
true;}
//parameter fullDP
if (c== 'd'){
if (fullDP){
fullDP = false;
cout << "fullDP = false" << endl;
}
else{
fullDP = true;
cout << "fullDP = true" << endl;
}
flag = true;
}
if (flag) {
StereoSGBM SGBM(minDisparity, ndisparities, SADWindowSize, P1,P2,
disp12MaxDiff, preFilterCap, uniquenessRatio,
speckleWindowSize, speckleRange, fullDP);
SGBM(temp_kiri, temp_kanan, temp_disp16S);
double nilaiMin, nilaiMax;
minMaxLoc(temp_disp16S, &nilaiMin, &nilaiMax);
temp_disp16S.convertTo(temp_disp8U,
CV_8UC1, 255/(nilaiMax-nilaiMin));
flag = false;

}
//untuk keluar tuning press escape
if (c == 27 ) break;

Universitas Indonesia

101

cvDestroyWindow("windowDisparity");
rekonstruksi3D(citra_kiri,temp_disp8U);
break;

}
if (in == 27) {
cvDestroyWindow("Kamera Stereo");
break;
}

void rekonstruksi3D(Mat citra, Mat citraDisparity){

//Load Matrix Q
Mat Q;
FileStorage fs("data/matriks/Q.xml", cv::FileStorage::READ);
fs["Q"] >> Q;

pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new


pcl::PointCloud<pcl::PointXYZRGB>);

double X, Y, Z;
uchar R, G, B;

double koor_X, koor_Y, koor_Z

Universitas Indonesia

102

depth = new double* [citra.rows];

for (int i = 0; i < citra.rows; i++)


{
uchar* rgb_ptr = citra.ptr<uchar>(i);
uchar* disp_ptr = citraDisparity.ptr<uchar>(i);
depth[i] = new double [citra.cols];
for (int j = 0; j < citra.cols; j++)
{
uchar d = disp_ptr[j];
if ( d == 0 ) continue; //Discard bad pixels
double W = 1.0 * static_cast<double>(d) *
Q.at<double>(3,2) + Q.at<double>(3,3);
X = static_cast<double>(j) + Q.at<double>(0,3);
Y = static_cast<double>(i) + Q.at<double>(1,3);
Z = Q.at<double>(2,3);

koor_X = X/W;
koor_Y = Y/W;
koor_Z = Z/W;

depth[i][j] = Z;

B = rgb_ptr[3*j];
G = rgb_ptr[3*j+1];
R = rgb_ptr[3*j+2];

pcl::PointXYZRGB point;
point.x = koor_X;
point.y = koor_Y;
point.z = koor_Z;

Universitas Indonesia

103

uint32_t rgb = (static_cast<uint32_t>(pr) << 16 |


static_cast<uint32_t>(pg) << 8 | static_cast<uint32_t>(pb));
point.rgb = *reinterpret_cast<float*>(&rgb);
point_cloud_ptr->points.push_back (point);
}
}

namedWindow("citra");
namedWindow("citra disparity");
cvSetMouseCallback( "citra disparity", mouseHandler, NULL );
cvSetMouseCallback( "citra", mouseHandler, NULL );
bool flag = true;
while (flag) {
imshow("citra", citra);
imshow("citra disparity", citraDisparity);
char c = cvWaitKey(33);

if (c==27){
destroyWindow("citra");
destroyWindow("citra disparity");
flag = false;
}

point_cloud_ptr->width = (int) point_cloud_ptr->points.size();


point_cloud_ptr->height = 1;

//buat visualizer
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;

Universitas Indonesia

104

viewer = createVisualizer( point_cloud_ptr );

while ( !viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep (boost::posix_time::microseconds (100000));
}

return;
}

void mouseHandler(int event, int x, int y, int flags, void *param)


{
switch(event) {
/* left button down */
case CV_EVENT_LBUTTONDOWN:
//fprintf(stdout, "Left button down (%d, %d).\n", x, y);
cout << "Left button down " << x << " " << y << " depth "
<< depth[x][y] << endl;
break;

/* right button down */


case CV_EVENT_RBUTTONDOWN:
fprintf(stdout, "Right button down (%d, %d).\n", x, y);
break;
}
}
boost::shared_ptr<pcl::visualization::PCLVisualizer>
createVisualizer (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
{

Universitas Indonesia

105

boost::shared_ptr<pcl::visualization::PCLVisualizer>

viewer

(new

pcl::visualization::PCLVisualizer ("3D Viewer"));


viewer->setBackgroundColor (0, 0, 0);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB>
rgb(cloud);
viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "reconstruction");
//viewer->setPointCloudRenderingProperties
(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "reconstruction");
viewer->addCoordinateSystem ( 1.0 );
viewer->initCameraParameters ();
return (viewer);
}

Universitas Indonesia

106

LAMPIRAN 2. Beberapa Hasil Percobaan

Universitas Indonesia

107

Universitas Indonesia

108

Universitas Indonesia

Anda mungkin juga menyukai