Deteksi Pelat Kendaraan dengan OCR
Deteksi Pelat Kendaraan dengan OCR
TUGAS AKHIR
Oleh
ALAN SURYAWINATA
NIM 2212151065
Oleh
ALAN SURYAWINATA
NIM 2212151065
Konsentrasi Teknik Instrumentasi dan Kendali
Menyetujui,
Pembimbing
Oleh
ALAN SURYAWINATA
NIM 2212151065
Konsentrasi Teknik Instrumentasi dan Kendali
Menyetujui,
Pembimbing
Mengetahui,
(materai 6000)
(Alan Suryawinata)
ABSTRAK
Pelat nomor polisi kendaraan adalah salah satu bagian penting dari kendaraan
bermotor atau bisa disebut Tanda Nomor Kendaraan Bermotor (TNKB). TNKB
merupakan identitas utama dari sebuah kendaraan bermotor yang layak
jalan/beroperasi di jalan raya, sehingga pelat nomor polisi umumnya diletakkan
pada posisi yang mudah dilihat. Berdasarkan data badan pusat statistik Jawa
Barat, jumlah kendaraan non public pada tahun 2016 mencapai angka 15.924.034
kendaraan.
Hasil pembacaan karakter pada pelat memiliki hasil yang cukup baik dan faktor
yang berpengaruh dalam hasil output sistem antara lain bentuk pelat, intensitas
cahaya, kualitas citra, metode pembacaan pelat serta training dataset yang kurang
banyak.
i
ABSTRACT
The police vehicle number plate is one of the important parts of a motorized
vehicle or it can be called a vehicle registration plate. Vehicle registration plate is
the main identity of a vehicle that is suitable to be used / operated on the highway,
so police license plates mounted above are easily seen. Based on West Java
statistical center data, the number of non-public vehicles in 2016 reached
15,924,034 vehicles.
The results of the character reading on the plate have quite good results and the
factors that influence the output system between the shape plate, light intensity,
image quality, plate reading method and training dataset are less numerous.
ii
KATA PENGANTAR
Dengan mengucap puji dan syukur kehadirat Allah SWT, karena atas ridho dan
hidayahNya, sehingga penulis dapat menyelesaikan Penelitian ini.
Maksud dan tujuan dari penulisan Penelitian ini adalah untuk memenuhi
persyaratan kelulusan program Studi Strata I pada Jurusan Teknik Elektro di
Universitas Jendral Ahmad Yani Cimahi. Selain itu penulis juga dapat mencoba
menerapkan dan membandingkan pengetahuan dan keterampilan yang diperoleh
dibangku kuliah untuk melakukan pembuatan aplikasi penelitian.
Penulis merasa bahwa dalam menyusun penelitian ini masih menemui beberapa
kesulitan dan hambatan, disamping itu juga menyadari bahwa penulisan penelitian
ini masih jauh dari sempurna dan masih banyak kekurangan-kekurangan lainnya,
maka dari itu penulis mengharapkan saran dan kritik yang membangun dari semua
pihak.
Menyadari penyusunan penelitian ini tidak lepas dari bantuan berbagai pihak,
maka pada kesempatan ini penulis menyampaikan ucapan terima kasih yang
setulus-tulusnya kepada:
1) Bapak Dede Masukan nama lengkap disini dan gelar, S.Kom, M.T.
sebagai dosen pembimbing pertama yang telah bersedia untuk
meluangkan waktu untuk membimbing, memeriksa, serta memberikan
petunjuk-petunjuk serta saran dalam penyusunan penelitian ini.
2) Bapak Masukan kepala jurusan dan gelar disini. Selaku ketua kompetensi
keahlian Teknik Elektro di Universitas Jendral Ahmad Yani kota Cimahi.
3) Ade Abdul Gofur, S.T. selaku Supervisor SDM di PT Tirta Gemah Ripah
yang telah mempermudah penulis dalam pengambilan data dilingkungan
perusahaan.
4) Seketaris Jurusan Teknik Informatika Universitas Jendral Ahmad Yani
yang telah membantu penulis dalam mengurus proposal penelitian.
iii
5) Seluruh staf pengajar Universitas Jendral Ahmad Yani yang telah
membimbing dan memberikan materi perkuliahan kepada penulis.
6) Seluruh staf Perpustakaan Universitas Jendral Ahmad Yani yang telah
membantu penulis dalam peminjaman buku.
7) Papa, mama dan anggota keluarga yang tercinta atas curahan kasih
sayang, doa dan dorongan baik moril maupun materil kepada penulis.
8) Hardiyan Ichsan Gunawan dan Irwan Shofwan sebagai teman yang ahli
dalam Bahasa pemprograman Pyrhon, yang banyak memberikan ide-ide
baru untuk penelitian ini.
9) Teman kerja seperusahaanku Iman Holik, Purwana, Fikri, Kodam, Herry
Indriana, Dede Yunus serta rekan kerja lain yang tidak dapat penulis
sebutkan satu persatu, karena meringankan dan mempermudah saya dalam
mengerjakan penelitian di lingkungan perusahaan.
10) Seluruh rekan -rekan di U nivers itas J endral Ahmad Yani Bandung,
khus us nya Jurusan Elektro Angkatan ’15 yang telah memberikan saran
dan kritikan kepada penulis.
11) Seluruh pihak yang tidak dapat disebutkan satu persatu, yang telah
banyak membantu selama ini.
Alan Suryawinata
iv
DAFTAR ISI
ABSTRAK................................................................................................................i
ABSTRACT.............................................................................................................ii
KATA PENGANTAR............................................................................................iii
DAFTAR ISI............................................................................................................v
DAFTAR LAMPIRAN..........................................................................................vii
DAFTAR GAMBAR............................................................................................viii
DAFTAR TABEL....................................................................................................x
DAFTAR SINGKATAN........................................................................................xi
BAB I PENDAHULUAN........................................................................................1
1.1. Latar Belakang................................................................................................1
1.2. Rumusan Masalah...........................................................................................2
1.3. Tujuan Penelitian............................................................................................2
1.4. Batasan Masalah.............................................................................................3
BAB II TEORI PENUNJANG................................................................................4
2.1. Tinjauan Pustaka.............................................................................................4
2.2. Dasar Teori.....................................................................................................4
2.2.1. Pelat Nomor Kendaraan.............................................................................4
2.2.2. Citra Digital (Image)..................................................................................6
2.2.3. Pengolahan Citra Digital............................................................................8
2.2.4. Video........................................................................................................14
2.2.5. Optical Character Recognition (OCR).....................................................15
2.2.6. Open CV (Computer Vision)...................................................................17
2.2.7. Haar-Like Feature...................................................................................18
2.2.8. Haar Classifier........................................................................................20
2.2.9. Cascade Classifier...................................................................................21
2.2.10. Gaussian Noise........................................................................................22
2.2.11. Contour....................................................................................................23
2.2.12. K-Nearest Neighbor.................................................................................24
BAB III METODE PENELITIAN........................................................................26
v
3.1. Analisis Sistem................................................................................................26
3.1.1. Analisis Kebutuhan Perangkat Keras (Hardware).......................................26
3.1.2. Analisis Kebutuhan Perangkat Lunak (Software)........................................26
3.2. Prosedur Penelitian.........................................................................................27
3.2.1. Waktu dan Lokasi Penelitian.......................................................................27
3.2.2. Teknik Pengambilan Data............................................................................28
3.2.3. Desain dan Perancangan Sistem..................................................................29
3.2.4. Analisis Kinerja Sistem................................................................................42
BAB IV HASIL PENGUJIAN DAN ANALISIS..................................................43
4.1. Hasil Penelitian.............................................................................................43
4.2. Pembahasan..................................................................................................47
4.2.1. Posisi Pelat...............................................................................................47
4.2.2. Warna pelat..............................................................................................49
4.2.3. Intensitas Cahaya.....................................................................................49
4.2.4. Training dataset........................................................................................49
BAB V KESIMPULAN DAN SARAN.................................................................50
5.1. Kesimpulan.....................................................................................................50
5.2. Saran.............................................................................................................50
DAFTAR PUSTAKA............................................................................................52
vi
DAFTAR LAMPIRAN
vii
DAFTAR GAMBAR
viii
Gambar 3.14. Diagram Alir (Flowchart) Proses Deteksi Karakter.......................40
Gambar 3.15. Diagram Alir (Flowchart) Pembacaan Karakter.............................41
Gambar 4.skian. Contoh Posisi Pelat Miring.........................................................47
Gambar 4.sekian. Hasil Contoh Pelat Miring........................................................48
Gambar 4.sekian. Pembanding Contoh Pelat Miring.............................................48
Gambar 4.sekian. Hasil Pembanding Contoh Pelat Miring...................................48
ix
DAFTAR TABEL
x
DAFTAR SINGKATAN
xi
BAB I PENDAHULUAN
1
Pi (Noor Azlin Tauchid, R Rumani, dan Budhi Irawan, S.Si., M.T. tahun 2015)
memiliki hasil yang cukup baik dalam pendeteksian karakter pada pelat
khususnya pada metode K-Nearest Neighbor memiliki akurasi 77,98%.
2
b. Merancang dan mengsimulasikan aplikasi yang mampu mendeteksi dan
mengkonstruksi karakter pelat kendaraan yang akan parkir dalam area
parkiran PT Tirta Gemah Ripah.
c. Menganalisis akurasi dari pembacaan keseluruhan karakter pada setiap
pelat dan akurasi pembacaan setiap karakter.
3
BAB II TEORI PENUNJANG
4
nomor atau Tanda Nomor Kendaraan Bermotor (TNKB) mempunyai aturan
pembuatan yang terdiri dari tulisan dua baris, antara lain:
a. Baris pertama menunjukkan: kode wilayah (huruf), nomor polisi (angka), dan
kode/seri akhir wilayah(huruf).
b. Baris kedua menunjukkan bulan dan tahun masa berlaku pelat.
Bahan baku TNKB adalah aluminium dengan ketebalan 1 mm. Ukuran TNKB
untuk kendaraan bermotor roda 2 dan roda 3 adalah 250×105 mm, sedangkan
untuk kendaraan bermotor roda 4 atau lebih adalah 395×135 mm. Korps Lantas
Mabes Polri terhitung mulai April 2011 mengganti desain pelat nomor kendaraan.
Ukurannya lebih panjang 5 sentimeter daripada pelat nomor sebelumnya.[2]
Selain itu, perbedaan lainnya terdapat pada tampilan. Pelat TNKB baru memiliki
lis putih disekeliling pelat. Antara nomor TNKB dengan masa berlaku dak diberi
pembatas lis putih. Namun seperti pelat nomor lama, pada pelat ada dua bariss
yakni baris pertama yang menunjukkan kode wilayah kendaraan, nomor polisi dan
kode seri akhir wilayah. Baris kedua menunjukkan masa berlaku pelat nomor.
5
huruf (font) yang sama. Gambar 2.1 merupakan contoh terbaru dari pelat
kendaraan bermotor.
Sebuah citra digital dapat mewakili oleh sebuah matriks yang terdiri dari M kolom
N baris, dimana perpotongan antara kolom dan baris disebut piksel (piksel =
picture element), yaitu elemen terkecil dari sebuah citra. Piksel mempunyai dua
parameter, yaitu koordinat dan intensitas atau warna. Nilai yang terdapat pada
koordinat (x, y) adalah f(x, y), yaitu besar intensitas atau warna dari piksel di titik
itu [3].Oleh sebab itu, sebuah citra digital dapat ditulis dalam bentuk matriks
berikut.
6
Beberapa format umum saat ini, yaitu bitmap (.bmp), tagged image format (.tif,
tiff), portable network graphics (.png), graphics interchange format (.gif), jpeg
(.jpg), mpeg (.mpg), dll [4].
a. Format Citra Bitmap
File format BMP bisa disebut juga bitmap atau format file DIB (untuk perangkat
independen bitmap), adalah sebuah file citra format yang digunakan untuk
menyimpan citra digital bitmap. Meskipun format BMP tidak bagus dari segi
ukuran berkas, namun format BMP memiliki kualitas citra yang lebih baik dari
format JPG maupun GIF. Karena citra dalam format BMP umumnya tidak
dimampatkan atau dikompresi sehingga tidak ada informasi yang hilang.
7
Gambar 2.3. Gambar Citra PNG (.png)
(Sumber: https://www.kisspng.com)
8
lossless compression, yaitu teknik untuk mengurangi ukuran file citra tanpa
merusak kualitas citranya tetapi dapat mengakibatkan degradasi warna. File GIF
hanya cocok untuk citra dengan jumlah warna yang sedikit misalnya animasi
sederhana, banner iklan, header, dan sebagainya.
Proses pengolahan citra secara diagram proses dimulai dari pengambilan citra,
perbaikan kualitas citra, sampai dengan pernyataan representatif citra yang
dicitrakan sebagai berikut:
9
Nilai suatu pixel memiliki nilai dalam rentang tertentu, dari nilai minimum sampai
nilai maksimum. Jangkauan yang digunakan berbeda-beda tergantung dari jenis
warna yang digunakan. Secara umum jangkauannya adalah 0-255. Citra dengan
penggambaran seperti ini digolongkan ke dalam citra integer.
Wijaya dan Tjiharjadi menjelaskan Proses awal yang sering dilakukan pada
Image Processing adalah mengubah citra berwarna menjadi citra grayscale. Hal
ini dilakukan untuk menyederhanakan model citra. Di dalam suatu gambar true
color (RGB) terdapat tiga layer matriks, yaitu R-layer, G- layer, dan B-layer. Pada
Image Processing dilakukan proses-proses terhadap ketiga layer tersebut, berarti
dilakukan perhitungan yang sama pada setiap layer. Dengan demikian konsep
grayscale adalah mengubah tiga layer tersebut menjadi satu layer matriks
grayscale, yang menghasilkan satu citra grayscale.
Dalam melakukan konversi citra dengan mengubah nilai piksel yang semula
mempunyai 3 nilai yaitu R, G, B menjadi satu nilai keabuan atau biner. Untuk
operasi konversi citra digunakan persamaan berikut:
10
R+G+B
k O=
3
Bisa juga dengan memberi bobot (w) pada RGB dikarenakan mata manusia lebih
sensitif pada warna hijau, merah dan biru. Operasi tersebut dapat digunakan
persamaan sebagai berikut [6]:
k 0=w r R i+ wg G i+ wb Bi
Di mana:
Ko: nilai keabuan pada pixel ke 0
wr: bobot untuk elemen warna merah
wg: bobot untuk elemen warna hijau wb: bobot untuk elemen warna biru
Ri: nilai intensitas elemen warna merah
Bi: nilai intensitas elemen warna biru
Gi: nilai intensitas elemen warna hijau
B. Memaksimalkan Kontras
Kontras adalah tingkat penyebaran piksel-piksel kedalam intensitas warna. Ada 3
macam kontras, yaitu Rendah, Tinggi dan Normal. [7]
a. Rendah, citra yang memiliki kontras rendah dapat terjadi karena kurangnya
pencahayaan, citra ini memiliki kurva histogram yang sempit (tingkat
penyebaran warna tidak sampai ke hitam pekat dan putih terang).
11
Gambar 2.7. Kontras Tinggi
c. Normal, Kurva histogram tidak terlalu besar dan tidak sempit.
Gambar 2.8. Kontras Normal
Ada beberapa cara untuk melakukan perhitungan kontras, namun yang saya
tampilkan sekarang adalah dengan rumus berikut:
f 0 ( x , y )=G ( fi ( x , y ) −P ) + P
Dimana:
G= koefisien penguatan kontras
P= Nilai grayscale yang dipakai sebagai pusat pengkontrasan
Contoh perhitungan:
12
Gambar 2.9. Contoh Perhitungan Kontras
13
segmentasi ditentukan oleh parameter tunggal yang dikenal sebagai ambang
intensitas. Dalam satu lintasan, setiap piksel dalam gambar dibandingkan dengan
ambang ini. Jika intensitas piksel lebih tinggi dari ambang, piksel diatur ke,
katakanlah, putih pada output. Jika kurang dari ambang, itu diatur ke hitam.
Untuk menghitung atau menentukan nilai-nilai setiap elemen dalam filter gaussian
yang akan dibentuk berlaku persamaan berikut :
h(x , y ) x 2+ y 2
=ⅇ
c 2 σ2
σ = Lebar dari fungsi gaussian
c = konstanta normalisasi
g (x, y)= citra hasil konvolusi
14
2.2.4. Video
Video adalah teknologi untuk menangkap, merekam, memproses,
mentransmisikan dan menata ulang gambar bergerak. Biasanya nenggunakan film
seluloid, sinyal elektronik atau media digital. Video Digital adalah berkas
computer yang digunakan untuk menyimpan kumpulan berkas digital seperti
video, audio, metadata, informasi, pembagian chapter, dan judul sekaligus, yang
dapat dimainkan atau digunakan melalui perangkat lunak tertentu pada komputer.
[10]
Video Digital terdiri dari urutan frame. Jika frame yang ditampilkan pada layar
cukup cepat, maka akan mendapatkan kesan gambar yang bergerak. Alasannya
adalah mata manusia tidak dapat membedakan frame-frame yang bergerak dengan
sangat cepat sebagai frame-frame yang terpisah. Belum ada jumlah standar frame
per detik; di Amerika Utara jumlah frame yang umum adalah 25 frame per detik.
Namun, untuk menghindari kondisi yang dikenal sebagai berkedip, frame perlu di
refresh. Sebuah video digital terdiri dari frame-frame yang mana frame-frame
tersebut dikompres menjadi sebuah file komputer yang hanya dapat dijalankan
menggunakan sebuah perangkat lunak multimedia player.
15
Secara umum blok diagram kerja OCR dapat dilihat pada Gambar 2.6 berikut.
16
mencocokkan komposisi struktur elementer dengan struktur yang sudah disimpan
memakai aturan tertentu misalnya memakai pendekatan teori bahasa formal dan
automata.[12]
17
g. Kalibrasi kamera (calibration patterns, estimasi fundamental matrix, estimasi
homography, stereo correspondence).
h. Analisis gerakan (optical flow, segmentation, tracking).
i. Pengenalan obyek (eigen-methods, HMM).
18
Gambar 2.12. Haar-Like Feature
Tiga tipe kotak fitur:
a. Tipe two-rectangle feature
b. Tipe three-rectangle feature
c. Tipe four-rectangel feature
Pada gambar 2.7 terdapat 3 tipe kotak, dimana tipe pertama adalah tworectangle
feature yang terdiri dari 2 persegi, tipe kedua adalah three-rectangle feature yang
terdiri dari 3 persegi dimana bagian tengah terdapat persegi berwarna hitam dan
tipe yang terakhir four-rectangle feature yang terdiri dari 2 persegi dengan persegi
berwarna hitam terdapat di dalam persegi putih. Tiap kotak-kotak digambar 2.7
mempunya nilai masing-masing yang diberi nama nilai Haar-Like Feature, yaitu
perbedaan antara jumlah nilai-nilai pixel gray level dalam daerah kotak hitam dan
daerah kotak putih. Nilai Haar-Like Feature diperoleh dari selisih jumlah nilai
piksel daerah gelap dengan jumlah nilai piksel daerah terang:
19
dan penjumlahan pixel terjadi secara terus menerus dan membutuhkan waktu yang
lama. Oleh karena itu, penjumlahan diganti dengan integral sehingga didapatkan
hasil lebih cepat. Hasil deteksi dari Haar-Like kurang akurat jika hanya
menggunakan satu fungsi saja sehingga biasanya digunakan beberapa fungsi
sekaligus. Semakin banyak fungsi yang digunakan maka hasilnya akan semakin
akurat. Pemrosesan Haar-Like feature yang banyak tersebut diorganisir atau diatur
di dalam classifier cascade. [15]
20
Semi-unsupervised:
input data terdiri dari data berlabel dan tidak
belajar bedasarkan contoh dan struktur data
Metode ini memerlukan 2 tipe gambar objek dalam proses training yang
dilakukan [17], yaitu:
1. Positive Samples
Berisi gambar objek yang ingin di deteksi, apabila ingin mendeteksi mata maka
positive samples ini berisi gambar mata, begitu juga objek lain yang ingin
dikenali.
2. Negative samples
Berisi gambar objek selain objek yang ingin dikenali, umumnya berupa gambar
background (tembok, pemandangan, lantai, dan gambar lainnya). Resolusi untuk
sampel negatif disarankan untuk memiliki resolusi yang sama dengan resolusi
kamera.
Training dari Haar menggunakan dua tipe sampel diatas. Informasi dari hasil
training ini lalu dikonversi menjadi sebuah parameter model statistik.
21
2.2.9. Cascade Classifier
Cascade classifier adalah sebuah rantai stage classifier, dimana setiap stage
classifier digunakan untuk mendeteksi apakah di dalam image sub-window
terdapat objek yang diinginkan (object of interest). Untuk mendapatkan nilai
cascade, perlu dilakukan training cascade. Classifier dengan banyak fitur akan
mendapat tingkat pendeteksian yang lebih tinggi serta error yang dibutuhkan
untuk penghitungannya [16]. Adapun atribu-atribut yang perlu diubah dan dicari
nilai optimalnya adalah sebagai berikut:
a. Jumlah stage,
b. Jumlah feature, dan
c. Nilai threshold.
Tiap stage mengurangi tingkat false positif serta meningkatkan tingkat
pendeteksian. Sedangkan jumlah stage akan terus ditambahkan hingga target
pendeteksian dan tingkat false positifnya ditemukan.
22
2.2.10. Gaussian Noise
Gaussian Noise merupakan titik-titik berwarna pada citra yang jumahnya sama
dengan persentase noise. Noise Gaussian dapat dibangkitkan dengan cara
membangkitkan bilangan acak [0,1]. [18] Kemudian titik-titik yang terkena noise,
nilai fungsi citra ditambahkan dengan noise yang ada atau dapat dirumuskan
sebagai berikut.
f (i, j)=g( i, j)+ p . a
Keterangan:
a = nilai bilangan acak berdistribusi gaussian
p = presentase noise
f(i,j) = nilai citra terkena noise
g(i,j) = nilai citra sebelum terkena noise
Untuk mengenali bagaimana jenis noise gaussian maka Gambar 2.3 berikut ini
adalah contoh gambar yang terkena Noise Gausssian.
2.2.11. Contour
Kontur (Contours) dapat dijelaskan secara simple seperti lengkungan yang
menggabungkan point-point yang berkelanjutan (disepanjang batas), yang
23
memilik warna dan intensitas yang sama. Kontur merupakan alat yang sangat
berguna untuk melakukan analisa bentuk, pendeteksi dan pengenalan objek.[19]
Untuk meningkatkan akurasi, gunakan gambar binary. Jadi sebelum mencari
kontur, gunakan fungsi threshold atau canny edge detection.
Fungsi findContours merubah gambar dari sumber. Jadi apabila pengguna
ingin gambar sumber tetap sama setelah mencari kontur, simpan gambar
dengan variable lain.
Dalam OpenCV, mencari kontur itu seperti mencari objek warna putih dalam
background hitam. Jadi jangan lupa bahwa objek yang akan dicari harusnya
berwarna putih dan background berwarna hitam.
24
menggunakan klasifikasi ketetanggaan sebagai nilai prediksi dari query instance
yang baru.
Nilai k yang terbaik untuk algoritma ini tergantung pada data. Secara umum, nilai
k yang tinggi akan mengurangi efek noise pada klasifikasi, tetapi membuat
batasan antara setiap klasifikasi menjadi semakin kabur. Nilai k yang bagus dapat
dipilih dengan optimasi parameter, misalnya dengan menggunakan cross-
validation. Kasus khusus dimana klasifikasi diprediksikan berdasarkan training
data yang paling dekat (dengan kata lain, k = 1) disebut algoritma nearest
neighbor.
Ketepatan algoritma KNN sangat dipengaruhi oleh ada atau tidaknya fitur-fitur
yang tidak relevan atau jika bobot fitur tersebut tidak setara dengan relevansinya
terhadap klasifikasi. Riset terhadap algoritma ini sebagian besar membahas
bagaimana memilih dan memberi bobot terhadap fitur agar performa klasifikasi
menjadi lebih baik.[21]
25
d. Mengumpulkan kategori Y (Klasifikasi nearestneighbor)
e. Dengan menggunakan kategori nearest neighbor yang paling mayoritas maka
dapat dipredisikan nilai query instance yang telah dihitung.
26
BAB III METODE PENELITIAN
27
3.2. Prosedur Penelitian
Tahapan pada penelitian ini sebagaimana ditunjukan pada gambar 3.1.
Mulai A
Desain dan
Pembuatan Laporan
Perancangan Sistem
A Selesai
28
Gambar 3.2. Area Pengambilan data
Waktu pengambilan data dilakukan pada jam masuk kerja yaitu pagi hari dengan
rentang waktu mulai pukul 07.30 sampai pukul 09.00 dan jam pulang kerja yaitu
sore hari dengan rentang waktu mulai pukul 17.00 sampai pukul 18.00. data yang
dikumpulkan akan digunakan untuk pengujian dari sistem yang dibuat.
29
3.2.3. Desain dan Perancangan Sistem
Akuisisi Data
Deteksi Pelat
Preprocessing
Deteksi Karakter
OCR dengan
K-Nearest Neighbor
Penyamaan Hasil
Text dengan
Database
Hasil
30
Dengan illustrasi system seperti berikut :
Text
Camera
Database
Gambar
Mentah Sistem OCR Pengguna
Kendaraan
31
Berikut diagram perancangan sistem yang digunakan:
Mulai A B C
Video
Preprocessing Hasil text Error Message
Masukan
Gambar
Pelat Nomer
Inisiasi Frame Membaca Database
dengan
Contour
Ya
Daftar
Penyimpanan Log
Karakter
Apakah Pelat N omer Pelat yang
C Tidak yang
tedeteksi? Terdeteksi
tedeteksi
Selesai
Pengenalan Karakter
Gambar (OCR)
Pelat Nomer
B
A
32
A. Video Masukan
Proses input merupakan langkah awal dan utama dalam percangan sistem. Berikut
spesifikasi video yang akan digunakan:
Resolusi : 1280 x 720 Pixel (720p)
Laju Frame (framerate) : 30 fps
Durasi : 1 – 5 menit (selama ada kendaraan dalam
video)
Video masukan sistem merupakan hasil pengambilan video dengan menggunakan
kamera statis yang disimpan dengan format file video .MOV resolusi 1280x720
dengan jenis RGB. Video yang telah diambil akan ditampilkan menggunakan fitur
video capture dari OpenCV namun apabila terjadi error, sistem akan mengirimkan
error message pada user. Video yang telah terbaca akan ditampilkan dan siap
untuk dijalankan seperti gambar 3.8.
33
Gambar ouput akan disamakan dengan Training Dataset menggunakan algoritma
K-Nearest Neighbor dengan rincian sebagai berikut :
Tabel 3.1. Training Dataset Karakter 0-H
Karakte Gambar Jumlah Karakte Gambar Jumlah
r r
0 24 9 20
1 24 A 16
2 24 B 24
3 24 C 10
4 24 D 16
5 24 E 9
6 24 F 12
7 13 G 11
8 24 H 10
34
Tabel 3.1. Training Dataset Karakter I-Z
Karakte Gambar Jumlah Karakte Gambar Jumlah
r r
I 17 R 8
J 9 S 10
K 10 T 9
L 9 U 9
M 9 V 9
N 12 W 13
O 20 X 6
P 16 Y 10
Q 6 Z 6
35
F. Deteksi Pelat Kendaraan
Mulai A
Gambar Gambar
Angka dan dengan
Huruf Font tanda pelat
Pelat berbentuk
Indonesia persegi
Data Training
berbentuk Gambar
.xml Pelat
Deteksi Region Of
RAW Image Selesai
Interest
36
ditraining dalam classifier. Objek yang terdeteksi akan ditampilkan dalam
beberapa persegi dalam gambar. Dalam melakukan proses deteksi, ada beberapa
tahapan yang harus dilakukan untuk mendapatkan gambar yang hanya berisi
gambar pelat nomor.
c. Pemotongan Gambar
Setelah region of interest (ROI) gambar telah ditemukan, maka akan
dicrop/dipotong objeknya saja untuk mempercepat dan meningkatkan akurasi
dalam pembacaan angka pada pelat. Apabila pelat tidak dicrop, sistem akan
membaca seluruh gambar dan hasil output akan banyak yang tidak sesuai. Metode
pemotongan pelat yang digunakan adalah numpy arrays (slicing). Numpy Arrays
(Slicing) merupakan metode pemotongan berdasarkan data array yang terdapat
37
pada objek, objek dalam sistem ini ialah kotak merah hasil Region of Interest
(ROI).
38
Mulai A B
Gambar
Grayscale Gambar yang
Gambar
dengan telah di
Pelat
Maksimum Threshold
Kontras
Gambar Blurred
Pelat Gambar
Grayscale Pelat
A B
39
Gambar 3.10. Hasil Konversi Gambar RGB ke Grayscale
b. Meningkatkan kontras pada gambar grayscale. Kontras yang rendah dapat
menyebabkan hasil OCR yang buruk. Tingkat kontras dan kepadatan gambar
harus ditingkatkan sebelum melakukan proses OCR. Hal tersebut dapat
membuat text dan backgroundnya terlihat lebih jelas dalam gambar output.
40
Gambar 3.12. Hasil Blur
41
Proses deteksi karakter merupakan proses yang akan memisahkan setiap digit
darikarakter pada gambar menjadi gambar yang terpisah. Metode yang digunakan
untuk mendeteksi karakter ialah mencari contour dari hasil thresholding.
Mulai A
Pengelompokan
Gambar
Daftar
grayscale
Objek(Karakter)
dan thresh
dalam Gambar
Objek
Konversi gambar ke
(Karakter)
binary
pada Gambar
Membuang objek
Gambar
(karakter) yang
grayscale
saling timpang
dan thresh
tindih
Objek
Mencari potensi
(Karakter)
objek dalam gambar
pada Gambar
42
I. Pembacaan Karakter
Pada proses ini dilakukan pengenalan terhadap karakter pelat nomor yang sudah
terdeteksi melalui proses deteksi karakter. List karakter yang telah terdeteksi akan
dicocokan dengan Training dataset yang telah dibuat dengan metode K-Nearest
Neighbor, yaitu metode yang menggunakan algoritma supervised dimana hasil
dari query instance yang baru diklasifikan berdasarkan mayoritas dari kategori
KNN. Training dataset yang digunakan adalah 521 pasang pola mewakili karakter
alfanumerik (A sampai Z dan 0 sampai 9).
Start A B C
Gambar
Gambar yang Pelat dengan
Resized
telah Karakter Data KNN
Image
diThreshold Yang
ditandai
Membuat gambar
Mengambil data
yang telat di Crop Gambar Meratakan Image
karakter dari hasil
threshold versi Karakter Menjadi 1D
KNN
berwarna
Gambar
Gambar
Threshold Gambar 1D Karakter
Karakter
Berwarna
Menyamakan Selesai
Menandai Karakter Merubah Ukuran Gambar Karakter
Pada Pelat Gambar Dengan Data
Training
A B C
43
menghubungkan data pelat yang terbaca dengan data yang ada dalam database.
Apabila terdapat data output yang sama, maka sistem akan menampilkan data
penggunanya berupa NIK (Nomor Induk Karyawan), nama, jabatan, dan bagian.
Semua pelat nomor yang terdeteksi pada sistem akan tersimpan berupa log dengan
bentuk file .csv yang dimana didalamnya terdapat pelat nomor yang terbaca dan
waktu kendaraan tersebut dicapture.
44
BAB IV HASIL PENGUJIAN DAN ANALISIS
45
12 B9690UCG 4DD Gagal 0 8 0.00%
13 F1554EV FIVJ Gagal 2 7 28.57%
14 B1396NOI B1396N0I Gagal 7 8 87.50%
15 B713NAA 373NAA Gagal 5 7 71.43%
16 Z1445DZ Z445DZ Gagal 6 7 85.71%
17 B63NIT 863NIT Gagal 5 6 83.33%
18 DR1717SN Gagal 0 8 0.00%
19 D1224AAN Gagal 0 8 0.00%
20 B1966RFR Gagal 0 8 0.00%
21 B805WYN 6805WYN Gagal 6 7 85.71%
22 DK935BO Gagal 0 7 0.00%
23 D1866IX 018661X Gagal 6 7 85.71%
24 D1732ACL Gagal 0 8 0.00%
25 D777CR 07Z7CR Gagal 4 6 66.67%
26 D1511V 01511V Gagal 5 6 83.33%
27 B1425ZFY Gagal 0 8 0.00%
28 Z6758LN 6758LN Gagal 6 7 85.71%
29 Z2422MD Z2422 Gagal 5 7 71.43%
30 B6308VOT DJZTF Gagal 0 8 0.00%
31 D6437IE 06437IE Gagal 6 7 85.71%
32 H2173AY 6IA1 Gagal 1 7 14.29%
33 D2512SX S1SX Gagal 3 7 42.86%
34 F3244TJ 341 Gagal 2 7 28.57%
35 B4855KBN SAS55WYV Gagal 3 8 37.50%
36 B4552TRA INSST1YV Gagal 1 8 12.50%
37 E5047QAB E50470A8 Gagal 6 8 75.00%
38 D3381SX L338SX Gagal 5 7 71.43%
39 B3241TUC 830C Gagal 2 8 25.00%
40 B6257BFR 0I2570FT Gagal 3 8 37.50%
41 B6631ZIS 883IS Gagal 3 8 37.50%
42 B1755UZS B1155UZS Gagal 7 8 87.50%
43 H1751LG U75I Gagal 3 7 42.86%
44 B1920SSO I920AS8 Gagal 4 8 50.00%
45 DM3190AS III Gagal 0 8 0.00%
46 B1242RTO ADF Gagal 0 8 0.00%
47 B102PHT Gagal 0 7 0.00%
48 BM1153SC Gagal 0 8 0.00%
49 B2500TKW I100T Gagal 3 8 37.50%
50 BK96WH Gagal 0 6 0.00%
Pelat Dari Perusahaan
51 D1031AEU 1AEU Gagal 4 8 50.00%
52 6060R 6060R Berhasil 5 5 100.00%
46
53 D1213AGN YVJ Gagal 0 8 0.00%
54 B1549IG IIV Gagal 0 7 0.00%
55 D1162ADH 162ADHX Gagal 6 8 75.00%
56 D1849AHK IIA1 Gagal 0 8 0.00%
57 D2566TP VXVI Gagal 0 7 0.00%
58 B4707THE 7AZZ1 Gagal 0 8 0.00%
59 D3268JX QS31 Gagal 1 7 14.29%
60 D3572SAC DD50DZHED Gagal 2 8 25.00%
61 D6302ABW KX7 Gagal 0 8 0.00%
62 D5757RD 575Z20 Gagal 3 7 42.86%
63 R2464BF 47Y Gagal 0 7 0.00%
64 R5944SS S944SS Gagal 5 7 71.43%
65 D6065JM 1222 Gagal 0 7 0.00%
66 D4508MW AZV Gagal 0 7 0.00%
67 D2426SA C747CS Gagal 2 7 28.57%
68 D5882VEB XAX Gagal 0 8 0.00%
69 D3904ZTO Z4T Gagal 2 8 25.00%
70 D3298GO 3298G0 Gagal 6 7 85.71%
71 D3693WY ALKYT Gagal 0 7 0.00%
72 D2808MO 70YA Gagal 0 7 0.00%
73 D3007OK Z1JV Gagal 0 7 0.00%
74 D1549IG 01549TG Gagal 5 7 71.43%
75 D1371SQ 01371S Gagal 5 7 71.43%
Dari tabel 4.1, terdepat 125 pelat kendaraan dengan rincian 100 pelat dari internet
dan 25 pelat kendaraan yang terdapat di PT Tirta Gemah Ripah. Jumlah hasil
karakter yang terdeteksi dalam pelat kendaraan perusahaan masih sangat sedikit
jadi sebagai tambahan data untuk menguji akurasi sistem telah disiapkan 100
gambar pelat nomor kendaraan yang didapatkan di Internet. 50 Pelat yang
didapatkan dari internet digunakan sebagai Training dataset, maka hanya terdapat
75 data yang dapat digunakan untk menghitung akurasi karakter. Hasil dari
pengolahan pelat kendaraan di PT Tirta Gemah Ripah selain sebagai data untuk
menghitung akurasi pendeteksian karakter, berfungsi juga sebagai tolak ukur
pengenalan sistem terhadap database yang tersimpan. Jumlah keseluruhan pelat
kendaraan yang terdeteksi dan memenuhi syarat untuk direkognisi akan dihitung
dengan menggunakan persamaan (3) sebagaimana yang dicantumkan pada bab III
sebelumnya.
47
Dan berikut hasil dari pengukuran karakter yang terdeteksi dari semua pelat :
Original Terdeteksi Akurasi
Angka Huruf Angka Huruf Angka Huruf
1 27 A 16 1 13 A 7 48.15% 43.75%
2 15 B 22 2 6 B 5 40.00% 22.73%
3 16 C 3 3 11 C 1 68.75% 33.33%
4 17 D 16 4 11 D 5 64.71% 31.25%
5 17 E 5 5 10 E 4 58.82% 80.00%
6 12 F 5 6 9 F 3 75.00% 60.00%
7 15 G 3 7 8 G 1 53.33% 33.33%
8 8 H 3 8 8 H 1 100.00% 33.33%
9 8 J 1 9 5 J 2 62.50% 200.00%
0 11 I 4 0 13 I 6 118.18% 150.00%
K 6 K 2 33.33%
L 2 L 2 100.00%
M 2 M 1 50.00%
N 9 N 6 66.67%
O 4 O 0 0.00%
P 1 P 0 0.00%
Q 3 Q 0 0.00%
R 6 R 1 16.67%
S 3 S 7 233.33%
T 4 T 4 100.00%
U 2 U 1 50.00%
V 5 V 6 120.00%
W 1 W 2 200.00%
X 3 X 3 100.00%
Y 3 Y 3 100.00%
Z 5 Z 5 100.00%
Tabel 4.2. Hasil Pengukuran Akurasi Setiap Karakter dari Semua Pelat
Dari tabel 4.2 terdapat 137 karakter huruf dan 146 karakter angka yang terdapat
pada pelat yang akan dibandingkan dengan Training dataset pada sistem. Dari
hasil perbandingan didapatkan 78 karakter huruf dan 94 karakter angka yang
jumlahnya lebih sedikit dari total karakter pada pelat. Jumlah setiap karakter yang
terdeteksi pun ada yang jumlahnya melebihi data sebenarnya dari karakter karena
terdapat objek yang salah dalam pendeteksiannya lalu objek tersebut memiliki
pixel yang sama dengan karakter pada Training dataset. Karakter yang
seharusnya tidak ada namun terdeteksi oleh sistem membuat akurasi dari
pendeteksian bertambah dari yang seharusnya.
48
MASUKAN PLOT/GRAFIK DISINI
4.2. Pembahasan
Hasil yang diperoleh setelah menerapkan Haar-like Cascade Classifier dan K-
Nearest Neighbor dalam melakukan Optical Character Recognition, diperoleh
tingkat akurasi yang beragam dari setiap digit karakter pelat (A sampai Z dan 0
sampai 9) yang terdeteksi. Presentase keberhasilan pendeteksian karakter pada
pelat terpengaruhi oleh beberapa faktor antara lain posisi (kemiringan dan jarak)
dari pelat, warna pelat, intensitas cahaya pada pelat dan Training dataset yang
menjadi pembanding karakter pada pelat.
4.2.1. Posisi Pelat
Posisi pelat yang miring dapat mempengaruhi hasil output apabila karakter miring
tersebut belum dimasukan kedalam Training Dataset seperti contoh berikut :
49
Gambar 4.2. Hasil Contoh Pelat Miring
Dan sebagai pembanding berikut gambar pelat yang sama namun dengan posisi
yang tidak miring seperti gambar sebelumnya seperti berikut:
50
kontur atau pola dari gambar, apabila warna putih mulai pudar dan sudah tidak
berbentuk karakter yang seharusnya maka system pun akan salah dalam
pembacaannya. Seperti contoh berikut :
51
Gambar 4.7. Pelat dengan Intensitas Cahaya Belang
Gambar 4.7 menunjukan disisi kiri pada gambar pelat memiliki intensitas cahaya
yang lebih gelap daripada sisi kanan dan karakternya pun lebih gelap. Hal tersebut
dapat membuat system tidak mengenali karakter yang terdapat pada sisi gelap
karena system mengira karakter tersebut berwarna hitam.
52
BAB V KESIMPULAN DAN SARAN
5.1. Kesimpulan
Berdasarkan hasil pengujian yang dilakukan pada sistem deteksi pelat kendaraan
di PT Tirta Gemah Ripah, maka dapat disimpulkan bahwa:
1. Banyak faktor yang mempengaruhi ketepatan akurasi sistem dalam
mendeteksi karakter pada pelat nomor diantaranya intensitas cahaya pada
pelat, kualitas gambar masukan, Training dataset yang digunakan sebagai
pembanding, metode pemprosesan gambar masukan sebelum dilakukan OCR,
dan bentuk pelat kendaraan.
2. Diperlukan banyak Training dataset karena kondisi pelat kendaraan tidak
mungkin semuanya mulus jadi karakter pada Training dataset diperlukan
bervariasi sebanyak mungkin.
3. Deteksi yang tersulit adalah deteksi karakter “O” dan B, dikarenakan pada
format plat nomor di Indonesia, karakter “O” dan “0” memiliki bentuk
karakter yang sama. Sementara itu, huruf B pada plat nomor test seringkali
dalam keadaan buruk dan juga seringkali menempel dengan objek lain seperti
tepi pembatas sehingga tidak dapat di contour.
4. Algoritma K-Nearest Neighbor dapat digunakan sebagai metode OCR dengan
hasil yang cukup baik.
5. Sistem mampu menampilkan data pada database sesuai dengan output dari
sistem serta mencatat log output ke file teks dokumen.
5.2. Saran
Dalam pengembangan program pendeteksian pelat kendaraan mobil dan motor
pada PT Tirta Gemah Ripah masih banyak terdapat kekurangan, oleh karena itu
penulis mengharapkan lebih banyak perbaikan dan pengembangan pada penelitian
selanjutnya. Berikut ini beberapa saran dari penulis untuk pengembangan pada
penelitian selanjutnya:
1. Perbanyak Training dataset dari setiap karakter pada pelat karena Training
dataset merupakan kunci dari penyamaan karakter sistem.
53
2. Apabila ingin mengambil data pada malam hari, pastikan intensitas yang
menerangi pelat nomor kendaraan cukup terang karena jika pelat gelap
ditakutkan sistem tidak akan menganggap karakter tersebut objek yang akan
dideteksi.
3. Penempatan kamera perlu disimpan didepan pelat nomor dan terfokus ke pelat
nomor, apabila terlalu banyak objek selain pelat nomor akan berdampak pada
pendeteksian ROI objek.
4. Pastikan penandaan ROI untuk melakukan potongan pelat tidak melenceng ke
objek yang lain karena apabila pemotongan ke objek yang lain maka karakter
yang terdeteksi pasti berbeda dengan yang seharusnya.
5. Diperlukan pengujian dengan metode lain untuk mengetahui perbandingan
tingkat akurasi dan kecepatan proses dari tiap-tiap metode guna meningkatkan
akurasi dan efisiensi waktu proses dari program yang dijalankan.
54
DAFTAR PUSTAKA
[1]BPS Jawa Barat. 2018. Jumlah Kendaraan Bermotor Umum dan Bukan
Umum Untuk BPKB Menurut Cabang Pelayanan di Jawa Barat, 2018.
Tersedia: https://jabar.bps.go.id/statictable/2018 [diakses1 Agustus 2019]
55
[15]Shulur, Sandy Permata. 2015. Perancangan Aplikasi Deteksi Wajah
Menggunakan Algoritma Viola-Jones. Bandung: Universitas Pasundan.
[16]Papilaya, Ryvalldo Anugrah. 2018. Implementasi Gesture Recognition
Dengan Metode Fingertip Tracking pada Aplikasi Simulasi Controlling
Dance Touch Berbasis Desktop. Bandung: Universitas Komputer.
[17]Kuswara, Randy. 2013. Aplikasi Pendeteksi Mata Mengantuk Berbasis Citra
Digital Menggunakan Metode Haar Classifier Secara Real Time. Bandung:
Universitas Komputer.
[18]Sastia Hendri Wibowo, dan Firman Susanto. 2016. Penerapan Metode
Gaussian Smoothing Untuk Mereduksi Noise Pada Citra Digital. Bengkulu:
Universitas Muhammadiyah.
[19]Official OpenCV (Open Source Computer Vision) website. Contours : Getting
Started.
[Online].Tersedia:https://docs.opencv.org/3.4/d4/d73/tutorial_py_contours
_begin.html [diakses 30 Juli 2019]
[21]Teknomo K., 2010. K-Nearest Neighbours Tutorial, K-Tetangga Terdekat
Tutorial, (Online). Tersedia:
http://people.revoledu.com/kardi/tutorial/KNN/ [diakses 30 Juli 2019]
[22]Official OpenCV (Open Source Computer Vision) website. Understanding k-
Nearest.Neighbour.[Online]. Tersedia: https://docs.opencv.org/3.0-
beta/doc/py_tutorials/py_ml/py_knn/py_knn_understanding/py_knn_under
standing.html [diakses 30 Juli 2019]
56
LAMPIRAN A
CODING PYTHON KESELURUHAN
import sys
from contextlib import contextmanager
from os import path, mkdir, listdir
from typing import Optional
import RPi.GPIO as GPIO
import time
import cv2
import numpy as np
from PyQt5.QtCore import QSize, QTimer, QStringListModel, Qt, \
QItemSelectionModel
from PyQt5.QtGui import QImage, QPixmap, QKeySequence
from PyQt5.QtWidgets import QWidget, QLabel, QApplication, QHBoxLayout, \
QShortcut, QVBoxLayout, QListView, QPushButton, QLineEdit, QGroupBox, \
QStyledItemDelegate
import data_provider
from model import PCALDAClassifier
class NoFacesError(Exception):
pass
class MultipleFacesError(Exception):
pass
class CapitalizeDelegate(QStyledItemDelegate):
def displayText(self, value, locale):
string = super().displayText(value, locale)
return string.capitalize()
class MainApp(QWidget):
STRANGER_DANGER = 350
IMAGE_SIZE = (100, 100)
A-1
# type: (int, Optional[QWidget]) -> None
super().__init__(parent=parent)
self.pkg_path = path.dirname(path.dirname(path.abspath(__file__)))
self.training_data_dir = path.join(self.pkg_path, 'train')
self.models_dir = path.join(self.pkg_path, 'models')
self.model_fname = 'fisherfaces.p'
try:
self.model = data_provider.load_model(
path.join(self.models_dir, self.model_fname))
except AssertionError:
self.model = None
self.existing_labels = QStringListModel(self.get_existing_labels())
self.fps = fps
self.video_size = QSize(640, 480)
self.gray_image = None
self.detected_faces = []
# Setup the UI
self.main_layout = QHBoxLayout()
self.setLayout(self.main_layout)
self.control_layout = QVBoxLayout()
self.control_layout.setSpacing(8)
self.main_layout.addItem(self.control_layout)
self.new_label_txt = QLineEdit(self)
self.new_label_txt.returnPressed.connect(self.add_new_label)
self.new_label_txt.returnPressed.connect(self.new_label_txt.clear)
self.control_layout.addWidget(self.new_label_txt)
A-2
# Setup the training area
train_box = QGroupBox('Train', self)
train_box_layout = QVBoxLayout()
train_box.setLayout(train_box_layout)
self.control_layout.addWidget(train_box)
self.train_btn = QPushButton('Train', self)
self.train_btn.clicked.connect(self.train)
train_box_layout.addWidget(self.train_btn)
self.control_layout.addStretch(0)
self.timer = QTimer()
self.timer.timeout.connect(self.display_video_stream)
self.timer.start(int(1000 / self.fps))
labels = self.existing_labels.stringList()
return labels[label_idx], distance
A-3
def get_training_data(self):
"""Read the images from disk into an n*(w*h) matrix."""
return data_provider.get_image_data_from_directory(
self.training_data_dir)
def train(self):
X, y, mapping = self.get_training_data()
# Inspect scree plot to determine appropriate number of PCA components
classifier = PCALDAClassifier(
n_components=2, pca_components=200, metric='euclidean',
).fit(X, y)
def add_new_label(self):
new_label = self.new_label_txt.text()
new_label = new_label.lower()
string_list = self.existing_labels.stringList()
def display_video_stream(self):
"""Read frame from camera and repaint QLabel widget."""
_, frame = self.capture.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = cv2.flip(frame, 1)
A-4
# Use the Viola-Jones face detector to detect faces to classify
face_cascade = cv2.CascadeClassifier(path.join(
self.pkg_path, 'resources', 'haarcascade_frontalface_default.xml'))
self.gray_image = gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
result = self.classify_face(face)
# If a model is loaded, we can predict
if result:
predicted, distance = self.classify_face(face)
if predicted.lower() == "zenzen":
print("Zenzen Detect")
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(12,GPIO.OUT)
time.sleep(5)
GPIO.cleanup()
A-5
cv2.rectangle(frame, (x, y), (x + w, y + h),
self.stranger_color, 2)
cv2.putText(frame, 'Stranger danger!', (x, y + h + 15),
cv2.FONT_HERSHEY_TRIPLEX, 0.5, self.stranger_color)
@contextmanager
def stop_camera_feed(self):
"""Temporarly stop the feed and face detection."""
try:
self.timer.stop()
yield
finally:
self.timer.start(int(1000 / self.fps))
def take_picture(self):
# Notify the user there were no faces detected
if self.detected_faces is None or len(self.detected_faces) < 1:
return
raise NoFacesError()
if len(self.detected_faces) > 1:
return
raise MultipleFacesError()
with self.stop_camera_feed():
x, y, w, h = self.detected_faces[0]
if not self.selected_label:
return
self.save_image(denoised_image, self.selected_label)
@property
def selected_label(self):
index = self.labels_view.selectedIndexes()
if len(index) < 1:
return None
A-6
label = self.existing_labels.data(index[0], Qt.DisplayRole)
return label
def get_existing_labels(self):
"""Get a list of the currently existing labels"""
return data_provider.get_folder_names(self.training_data_dir)
existing_files = listdir(label_path)
existing_files = map(lambda p: path.splitext(p)[0], existing_files)
existing_files = list(map(int, existing_files))
last_fname = sorted(existing_files)[-1] if len(existing_files) else 0
if __name__ == "__main__":
app = QApplication(sys.argv)
win = MainApp()
win.show()
sys.exit(app.exec_())
A-7
LAMPIRAN B
SAMPEL FOTO DATABASE
ADMIN 1 ANDI
imgNum=0
# Our operations on the frame come here
if k % 256 == 27:
# ESC pressed
print("Escape hit, closing...")
break
elif k % 256 == 32:
# SPACE pressed
path = 'input/ ' + timeformat +'.jpg'
cv2.imwrite(path, imagecopy)
print("{} written!".format(path))
# Display the resulting frame
cv2.imshow('frame',gray)
A-8
cv2.destroyAllWindows()
print ('time')
#cv2.imshow('capture' + first + "-" + end, gray)
main.main(path)
cv2.waitKey(0)
A-9
LAMPIRAN C
CODING PYTHON CHARDETECT.PY
import Preprocess
import cv2
import PossibleChar
import math
import numpy as np
import main
import os
import time
from datetime import datetime
kNearest = cv2.ml.KNearest_create()
MIN_PIXEL_WIDTH = 2
MIN_PIXEL_HEIGHT = 8
MIN_ASPECT_RATIO = 0.25
MAX_ASPECT_RATIO = 1.0
MIN_PIXEL_AREA = 80
MAX_CHANGE_IN_AREA = 0.5
C-1
MAX_ANGLE_BETWEEN_CHARS = 12.0
# other constants
MIN_NUMBER_OF_MATCHING_CHARS = 3
RESIZED_CHAR_IMAGE_WIDTH = 20
RESIZED_CHAR_IMAGE_HEIGHT = 30
MIN_CONTOUR_AREA = 100
try:
npaClassifications = np.loadtxt("data/classifications.txt", np.float32)
except:
print ("error, unable to open classifications.txt, exiting program\n")
return False
try:
npaFlattenedImages = np.loadtxt("data/knn2.txt", np.float32)
C-2
except:
print ("error, unable to open flattened_images.txt, exiting program\n")
return False
kNearest.setDefaultK(1)
return True
C-3
pt2 = ((currentChar.intBoundingRectX + currentChar.intBoundingRectWidth),
(currentChar.intBoundingRectY + currentChar.intBoundingRectHeight))
x = currentChar.intBoundingRectX
y = currentChar.intBoundingRectY
w = currentChar.intBoundingRectWidth
h =currentChar.intBoundingRectHeight
crop_img = imgThresh[y:y+(h), x:x+(w)]
npaROIResized = imgROIResized.reshape((1,
RESIZED_CHAR_IMAGE_WIDTH * RESIZED_CHAR_IMAGE_HEIGHT))
# flatten image into 1d numpy array
C-4
strCurrentChar = str(chr(int(npaResults[0][0]))) # get character from results
if main.showstep == True:
cv2.imshow(strCurrentChar, crop_img)
#cv2.imshow("tresh", imgThresh)
if main.writeresult == True:
filename= timeformat +'.jpg'
#filename=filename.replace("img/","")
dirc="output/char/"+filename
dirplatroi="output/sgmtchar"
# If need float32 for proving knn method here
#print (npaROIResized)
#np.savetxt('cobain.txt', npaROIResized)
if not os.path.exists(dirplatroi):
os.makedirs(dirplatroi)
cv2.imwrite(dirplatroi+"/"+filename+".jpg", imgThreshColor)
if not os.path.exists(dirc):
os.makedirs(dirc)
#print dirc+"/"+strCurrentChar
cv2.imwrite(dirc+"/"+str(i)+"-"+strCurrentChar+"-"+"Hasil"+".jpg",
crop_img)
i=i+1
strChars = strChars + strCurrentChar # append current char to full string
# end for
C-5
# end if # show steps
##################################################################
#######
return strChars
def removeInnerOverlappingChars(listOfMatchingChars):
listOfMatchingCharsWithInnerCharRemoved = list(listOfMatchingChars) #
this will be the return value
C-6
listOfMatchingCharsWithInnerCharRemoved.remove(otherChar) #
then remove other char
# end if
# end if
# end if
# end if
# end for
# end for
return listOfMatchingCharsWithInnerCharRemoved
# end function
return fltAngleInDeg
C-7
intY = abs(firstChar.intCenterY - secondChar.intCenterY)
fltAngleBetweenChars = angleBetweenChars(possibleChar,
possibleMatchingChar)
fltChangeInArea = float(abs(possibleMatchingChar.intBoundingRectArea -
possibleChar.intBoundingRectArea)) / float(possibleChar.intBoundingRectArea)
C-8
fltChangeInWidth = float(abs(possibleMatchingChar.intBoundingRectWidth -
possibleChar.intBoundingRectWidth)) /
float(possibleChar.intBoundingRectWidth)
fltChangeInHeight = float(abs(possibleMatchingChar.intBoundingRectHeight -
possibleChar.intBoundingRectHeight)) /
float(possibleChar.intBoundingRectHeight)
return listOfMatchingChars
def findListOfListsOfMatchingChars(listOfPossibleChars):
# with this function, we start off with all the possible chars in one big list
# the purpose of this function is to re-arrange the one big list of chars into a
list of lists of matching chars,
# note that chars that are not found to be in a group of matches do not need to
be considered further
listOfListsOfMatchingChars = [] # this will be the return value
C-9
for possibleChar in listOfPossibleChars: # for each possible char in the
one big list of chars
listOfMatchingChars = findListOfMatchingChars(possibleChar,
listOfPossibleChars) # find all chars in the big list that match the current char
listOfPossibleCharsWithCurrentMatchesRemoved = []
# remove the current list of matching chars from the big list so we
don't use those same chars twice,
# make sure to make a new big list for this since we don't want to
change the original big list
listOfPossibleCharsWithCurrentMatchesRemoved =
list(set(listOfPossibleChars) - set(listOfMatchingChars))
C-10
recursiveListOfListsOfMatchingChars =
findListOfListsOfMatchingChars(listOfPossibleCharsWithCurrentMatchesRemov
ed) # recursive call
# end for
return listOfListsOfMatchingChars
def checkIfPossibleChar(possibleChar):
# this function is a 'first pass' that does a rough check on a contour to see if it
could be a char,
# note that we are not (yet) comparing the char to other chars to look for a
group
if (possibleChar.intBoundingRectArea > MIN_PIXEL_AREA and
possibleChar.intBoundingRectWidth > MIN_PIXEL_WIDTH and
possibleChar.intBoundingRectHeight > MIN_PIXEL_HEIGHT and
MIN_ASPECT_RATIO < possibleChar.fltAspectRatio and
possibleChar.fltAspectRatio < MAX_ASPECT_RATIO):
return True
else:
return False
C-11
listOfPossibleChars = [] # this will be the return value
contours = []
imgThreshCopy = imgThresh.copy()
return listOfPossibleChars
# end function
def detectCharsInPlates(possiblePlate,filename):
intPlateCounter = 0
imgContours = None
contours = []
C-12
possiblePlate.imgThresh = cv2.resize(possiblePlate.imgThresh, (0, 0), fx = 1.6,
fy = 1.6)
thresholdValue, possiblePlate.imgThresh =
cv2.threshold(possiblePlate.imgThresh, 0.0, 255.0, cv2.THRESH_BINARY |
cv2.THRESH_OTSU)
listOfPossibleCharsInPlate =
findPossibleCharsInPlate(possiblePlate.imgGrayscale, possiblePlate.imgThresh)
listOfListsOfMatchingCharsInPlate =
findListOfListsOfMatchingChars(listOfPossibleCharsInPlate)
C-13
longestListOfMatchingCharsInPlate =
listOfListsOfMatchingCharsInPlate[intIndexOfLongestListOfChars]
possiblePlate.strChars = recognizeCharsInPlate(possiblePlate.imgThresh,
longestListOfMatchingCharsInPlate,filename)
if len(listOfListsOfMatchingCharsInPlate)==0:
print ("No character ditected!")
return possiblePlate
C-14