{"id":972,"date":"2021-05-03T00:26:40","date_gmt":"2021-05-03T00:26:40","guid":{"rendered":"https:\/\/unydevelopernetwork.com\/?p=972"},"modified":"2021-07-09T15:48:45","modified_gmt":"2021-07-09T15:48:45","slug":"membuat-deteksi-plat-nomer-kendaraan-sederhana-dengan-opencv-python","status":"publish","type":"post","link":"https:\/\/unydevelopernetwork.com\/index.php\/2021\/05\/03\/membuat-deteksi-plat-nomer-kendaraan-sederhana-dengan-opencv-python\/","title":{"rendered":"Membuat Deteksi Plat Nomer Kendaraan Sederhana Dengan OpenCV (Python)"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 9<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>\n<p>Pada postingan sebelumnya, Saya telah menulis bagaimana cara membuat program pendeteksi dan penghitung koin sederhana dengan menggunakan OpenCV [<strong><a href=\"https:\/\/unydevelopernetwork.com\/index.php\/2021\/04\/24\/membuat-penghitung-koin-sederhana-dengan-opencv\/\" target=\"_blank\" rel=\"noreferrer noopener\">lihat disini<\/a><\/strong>]. Nah, dengan menggunakan konsep yang hampir sama persis dengan postingan sebelumnya, kali in Saya akan berbagi kepada pembaca sekalian cara membuat program deteksi plat nomer kendaraan sederhana dengan menggunakan OpenCV. Sederhana yang dimaksud di sini adalah proses berhenti pada deteksi plat nomer saja, tidak sampai pembacaan angka dan huruf yang terdapat pada plat nomer tersebut. Untuk program pembacaan angka dan huruf yang terdapat pada plat nomer kendaraan akan menjadi bahasan berikutnya. Bagaimana cara membuat program deteksi plat nomer kendaraan sederhana ini? Apakah sulit? Mari kita simak postingan ini sampai akhir.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Sebelum kita beranjak ke pembuatan program, tentu kita ingin mengetahui terlebih dahulu &#8220;Apakah hasil akhir dari program ini?&#8221;. Ya karena program ini masih sangat sederhana, maka hasil akhir program ini tampak seperti tangkapan layar di bawah ini.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"502\" height=\"404\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-1.png\" alt=\"\" class=\"wp-image-974\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-1.png 502w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-1-300x241.png 300w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><figcaption>Hasil Akhir program pendeteksi plat nomer kendaraan<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ya, tampak pada tangkapan layar di atas, program yang dibuat sebatas hanya mendeteksi plat nomer kendaraan. Belum sampai pada tahap membaca huruf dan angka yang terdapat pada plat nomer tersebut. Namun tenang saja, topik selanjutnya akan saya bahas bagaimana cara membaca teks dengan menggunakan openCV. <\/p>\n\n\n\n<p>Baik, setelah kita mengetahui keluaran dari program ini, saatnya kita mulai saja untuk membuatnya. Terlebih dahulu, kita persiapkan tool dan library yang diperlukan untuk mengembangkan program ini. Tool dan library yang saya gunakan adalah sebagai berikut.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Python versi 2.7.18<\/li><li>OpenCV versi 4.1.0.25<\/li><li>Imutils versi 0.5.4<\/li><li>PyCharm Community Edition<\/li><\/ol>\n\n\n\n<p>Setelah kita siapkan tool dan library yang diperlukan, kita siap untuk mengembangkan program pendeteksi plat nomer kendaraan ini. Di sini, saya asumsikan Anda sudah memahami penggunaan PyCharm ya, sehingga saya tidak perlu menjelaskan panjang lebar bagaimana cara membuat project baru di PyCharm.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Inisiasi<\/h2>\n\n\n\n<p>Pada bagian inisiasi ini kita mempersiapkan PyCharm kita sehingga siap untuk membuat program. Oleh karena itu, ikutilah langkah-langkah berikut ini.<\/p>\n\n\n\n<p><strong>Langkah Pertama, <\/strong>buatlah sebuah project baru dengan nama <strong>&#8220;pendeteksi-plat-nomer-kendaraan&#8221;<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-2-700x546.png\" alt=\"\" class=\"wp-image-975\" width=\"491\" height=\"383\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-2-700x546.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-2-300x234.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-2-768x599.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-2.png 801w\" sizes=\"auto, (max-width: 491px) 100vw, 491px\" \/><figcaption>Membuat Project &#8220;pendeteksi-plat-nomer-kendaraan&#8221;<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ingat, jangan lupa untuk menambahkan library <strong>opencv-python<\/strong> versi <strong>4.1.0.25<\/strong>, dan <strong>imutils <\/strong>versi <strong>0.5.4<\/strong> ke dalam project.<\/p>\n\n\n\n<p><strong>Langkah Kedua, <\/strong>setelah project selesai dibuat, unduh gambar melalui tautan <strong><a href=\"https:\/\/cdn.unydevelopernetwork.com\/mobil_a.jpg\" target=\"_blank\" rel=\"noreferrer noopener\">ini<\/a><\/strong>, dan letakkan di dalam project. Beri nama gambar yang diunduh: <strong>contohmobil.jpg<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-3-700x400.png\" alt=\"\" class=\"wp-image-976\" width=\"526\" height=\"301\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-3-700x400.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-3-300x171.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-3-768x439.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-3.png 1132w\" sizes=\"auto, (max-width: 526px) 100vw, 526px\" \/><figcaption>Gambar Mobil yang berhasil diimport ke dalam project<\/figcaption><\/figure><\/div>\n\n\n\n<p><strong>Langkah Ketiga, <\/strong>buat script baru dengan nama <strong>pendeteksiplat.py<\/strong> ke dalam project. Sehingga hasil akhir dari <strong>tahap inisiasi<\/strong> ini adalah seperti tangkapan layar di bawah ini.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"325\" height=\"193\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-4.png\" alt=\"\" class=\"wp-image-977\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-4.png 325w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-4-300x178.png 300w\" sizes=\"auto, (max-width: 325px) 100vw, 325px\" \/><figcaption>Hasil akhir tahap inisiasi<\/figcaption><\/figure><\/div>\n\n\n\n<p>Selanjutnya, kita siap untuk membuat program pendeteksi plat nomer kendaraan sederhana.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Memuat Gambar Ke Dalam Program<\/h2>\n\n\n\n<p>Tahap berikutnya adalah memuat gambar yang sudah kita import di tahap sebelumnya ke dalam program. Untuk melakukannya ikuti langkah-langkah berikut ini.<\/p>\n\n\n\n<p><strong>Langkah pertama,<\/strong> import library openCV dan imutils ke dalam script. Ketikkan kode berikut ini.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2 as cv\nimport imutils as im<\/code><\/pre>\n\n\n\n<p><strong>Langkah kedua, <\/strong>Setelah kita mengimport kedua library tersebut, selanjutnya adalah memuat gambar tersebut. Fungsi yang digunakan adalah fungsi <strong>imread()<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>image = cv.imread('contohmobil.jpg')<\/code><\/pre>\n\n\n\n<p><strong>Langkah ketiga, <\/strong>Selanjutnya kita coba tampilkan gambar yang sudah dimuat ke dalam program dengan kode berikut ini.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cv.imshow(\"Gambar Asli\", image)<\/code><\/pre>\n\n\n\n<p><strong>Langkah keempat<\/strong>, tambahkan fungsi <strong>waitKey() <\/strong>dan <strong>destroyAllWindows()<\/strong> untuk mengatur timing dan tampilan hasil program.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cv.waitKey(0)\ncv.destroyAllWindows()<\/code><\/pre>\n\n\n\n<p><strong>Langkah kelima, <\/strong>kita coba jalankan <em>script<\/em> yang sudah kita buat, dan kita lihat hasilnya. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-6-700x438.png\" alt=\"\" class=\"wp-image-979\" width=\"485\" height=\"303\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-6-700x438.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-6-300x188.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-6-768x480.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-6.png 1280w\" sizes=\"auto, (max-width: 485px) 100vw, 485px\" \/><figcaption>Gambar berhasil dimuat ke dalam program<\/figcaption><\/figure><\/div>\n\n\n\n<p>Ya, gambar berhasil dimuat ke dalam program. Namun gambar masih sangat besar bahkan tidak seluruh muka gambar dapat ditampilkan di dalam layar monitor. Oleh karena itu, kita akan melanjutkan ke tahap selanjutnya, yakni mengubah dimensi gambar.<\/p>\n\n\n\n<p><strong>SCRIPT AKHIR TAHAP MEMUAT GAMBAR KE DALAM PROGRAM<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2 as cv\nimport imutils as im\n\nimage = cv.imread('contohmobil.jpg')\ncv.imshow(\"Gambar Asli\", image)\n\ncv.waitKey(0)\ncv.destroyAllWindows()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Mengubah Dimensi Gambar<\/h2>\n\n\n\n<p>Pada tahap ini, kita akan mengubah gambar yang sudah dimuat di dalam program sehingga tidak terlalu besar ukurannya ketika ditampilkan di layar monitor. Untuk melakukannya ikut langkah-langkah berikut.<\/p>\n\n\n\n<p><strong>Langkah pertama<\/strong>, gunakan fungsi <strong>resize()<\/strong> dari library <strong>imutils<\/strong>. Sisipkan kode berikut ini di antara variabel <strong>image<\/strong> dan fungsi <strong>imshow()<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>image = im.resize(image, width=500)<\/code><\/pre>\n\n\n\n<p><strong>Langkah kedua,<\/strong> ketika program kembali di jalankan, maka tampilannya akan berubah menjadi seperti tangkapan layar di bawah ini.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-7-700x438.png\" alt=\"\" class=\"wp-image-980\" width=\"504\" height=\"315\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-7-700x438.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-7-300x188.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-7-768x480.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-7.png 1280w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><figcaption>Muka gambar berhasil ditampilkan seluruhnya<\/figcaption><\/figure><\/div>\n\n\n\n<p><strong>SCRIPT AKHIR TAHAP MENGUBAH DIMENSI GAMBAR<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2 as cv\nimport imutils as im\n\nimage = cv.imread('contohmobil.jpg')\nimage = im.resize(image, width=500)\ncv.imshow(\"Gambar Asli\", image)\n\ncv.waitKey(0)\ncv.destroyAllWindows()<\/code><\/pre>\n\n\n\n<p>Setelah kita berhasil melakukan resize gambar, kini saatnya kita mengolah gambar tersebut sehingga dapat terdeteksi plat nomernya.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mengubah Color Space ke Grayscale<\/h2>\n\n\n\n<p>Pada tahap ini, kita akan mengubah color space gambar ke mode grayscale. Tujuannya adalah, supaya proses analisis dapat lebih presisi karena tidak terganggu oleh warna yang bermacam &#8211; macam. Untuk itu ikuti langkah &#8211; langkah berikut ini untuk mengubah color space menjadi grayscale.<\/p>\n\n\n\n<p><strong>Langkah pertama<\/strong>, tambahkan fungsi <strong>cvtColor()<\/strong> dengan flags <strong>COLOR_BGR2GRAY<\/strong> yang disimpan pada sebuah variabel. Tambahkan kode berikut ini.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)<\/code><\/pre>\n\n\n\n<p><strong>Langkah kedua, <\/strong>tambahkan fungsi <strong>imshow()<\/strong> untuk menampilkan hasil dari ubahan color space tersebut. Gunakan kode berikut ini.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cv.imshow(\"Gambar Grayscale\", gray)<\/code><\/pre>\n\n\n\n<p><strong>Langkah ketiga, <\/strong>jalankan script, maka akan tampil dua jendela yang menampilkan gambar asli dan gambar gray scale seperti tangkapan layar di bawah ini.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"285\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-8-700x285.png\" alt=\"\" class=\"wp-image-981\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-8-700x285.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-8-300x122.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-8-768x313.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-8.png 1006w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption>Dua jendela: gambar asli dan gambar grayscale<\/figcaption><\/figure><\/div>\n\n\n\n<p><strong>SCRIPT AKHIR TAHAP MENGUBAH COLOR SPACE KE GRAYSCALE<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2 as cv\nimport imutils as im\n\nimage = cv.imread('contohmobil.jpg')\nimage = im.resize(image, width=500)\ncv.imshow(\"Gambar Asli\", image)\n\ngray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)\ncv.imshow(\"Gambar Grayscale\", gray)\n\ncv.waitKey(0)\ncv.destroyAllWindows()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Menambahkan Efek Blur Bilateral<\/h2>\n\n\n\n<p>Seperti pada postingan saya sebelumnya <strong><a rel=\"noreferrer noopener\" href=\"https:\/\/unydevelopernetwork.com\/index.php\/2021\/04\/24\/membuat-penghitung-koin-sederhana-dengan-opencv\/\" target=\"_blank\">di sini<\/a><\/strong>. Efek blur ditambahkan pada gambar yang sudah selesai diubah color space nya menjadi grayscale. Hal ini dilakukan untuk meminimalisir kontur yang akan di baca pada tahap sebelumnya. Efek blur yang kita tambahkan pada program ini adalah efek blur bilateral atau sering disebut juga bilateral filter. Untuk menambahkan efek blur bilateral ini, gunakan kode berikut ini.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>blur = cv.bilateralFilter(gray, 11, 17, 17)<\/code><\/pre>\n\n\n\n<p>Saya tidak akan menjelaskan parameter-parameter yang terdapat pada kode diatas, karena Saya akan menjelaskan tentang jenis-jenis filter blur beserta parameternya pada postingan yang lain. Setelah menambahkan fungsi bilateral di atas, kita tambahkan fungsi <strong>imshow() <\/strong>untuk menampilkan hasil dari penambahan efek filter bilateral tersebut.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cv.imshow(\"Bilateral Filter\", blur)<\/code><\/pre>\n\n\n\n<p>Sehingga ketika kita jalankan <em>script<\/em> yang sudah ditambahkan kedua kode di atas, akan menghasilkan tampilan seperti tangkapan layar di bawah ini.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-9-700x418.png\" alt=\"\" class=\"wp-image-982\" width=\"521\" height=\"311\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-9-700x418.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-9-300x179.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-9-768x459.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-9.png 1105w\" sizes=\"auto, (max-width: 521px) 100vw, 521px\" \/><figcaption>Hasil penambahan filter bilateral pada gambar yang sudah diubah colorspace-nya<\/figcaption><\/figure><\/div>\n\n\n\n<p><strong>SCRIPT AKHIR TAHAP MENAMBAHKAN EFEK BLUR BILATERAL<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2 as cv\nimport imutils as im\n\nimage = cv.imread('contohmobil.jpg')\nimage = im.resize(image, width=500)\ncv.imshow(\"Gambar Asli\", image)\n\ngray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)\ncv.imshow(\"Gambar Grayscale\", gray)\n\nblur = cv.bilateralFilter(gray, 11, 17, 17)\ncv.imshow(\"Bilateral Filter\", blur)\n\ncv.waitKey(0)\ncv.destroyAllWindows()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Mencari Garis Tepi Dari Obyek Pada Gambar<\/h2>\n\n\n\n<p>Tahap selanjutnya adalah kita mencoba mencari garis tepi dari obyek-obyek yang terdapat pada gambar.  Untuk melakukan hal ini, kita menggunakan fungsi <em>edge detection<\/em> yakni fungsi <strong>canny()<\/strong>. Untuk melakukannya, ikuti langkah-langkah berikut ini.<\/p>\n\n\n\n<p><strong>Tahap pertama, <\/strong>tambahkan fungsi <strong>canny()<\/strong> pada gambar yang sudah diberikan efek filter bilateral pada tahap sebelumnya. Untuk itu gunakan kode berikut ini. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>edgeDet = cv.Canny(blur, 170, 200)<\/code><\/pre>\n\n\n\n<p><strong>Tahap kedua, <\/strong>seperti pada tahapan-tahapan sebelumnya kita coba tampilkan hasil dari deteksi tepi dari obyek-obyek yang ada di dalam gambar dengan menggunakan fungsi <strong>imshow()<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cv.imshow(\"Canny Result\", edgeDet)<\/code><\/pre>\n\n\n\n<p>Selanjutnya, kita coba jalankan program yang sudah kita tambahkan dua kode di atas. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/Screen-Shot-2021-05-03-at-05.50.50-700x483.png\" alt=\"\" class=\"wp-image-984\" width=\"562\" height=\"388\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/Screen-Shot-2021-05-03-at-05.50.50-700x483.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/Screen-Shot-2021-05-03-at-05.50.50-300x207.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/Screen-Shot-2021-05-03-at-05.50.50-768x529.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/Screen-Shot-2021-05-03-at-05.50.50.png 795w\" sizes=\"auto, (max-width: 562px) 100vw, 562px\" \/><figcaption>Hasil gambar setelah tepi-tepi obyek dideteksi<\/figcaption><\/figure><\/div>\n\n\n\n<p>Nah, dari tangkapan layar di atas, kini Anda dapat melihat plat nomer kendaraan mulai terlihat. Kini saaatnya kita mencoba mencari kontur dari plat nomer yang sudah mulai terdeteksi tersebut dan menggambarkan sesuatu di atasnya.<\/p>\n\n\n\n<p><strong>SCRIPT AKHIR TAHAP MENCARI GARIS TEPI DARI OBYEK PADA GAMBAR<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2 as cv\nimport imutils as im\n\nimage = cv.imread('contohmobil.jpg')\nimage = im.resize(image, width=500)\ncv.imshow(\"Gambar Asli\", image)\n\ngray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)\ncv.imshow(\"Gambar Grayscale\", gray)\n\nblur = cv.bilateralFilter(gray, 11, 17, 17)\ncv.imshow(\"Bilateral Filter\", blur)\n\nedgeDet = cv.Canny(blur, 170, 200)\ncv.imshow(\"Deteksi Tepi\", edgeDet)\n\ncv.waitKey(0)\ncv.destroyAllWindows()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Mencari Kontur Dan Menggambarnya<\/h2>\n\n\n\n<p>Tahap berikutnya adalah mencari kontur dan menggambar sesuatu di atasnya. Seperti halnya postingan saya <strong><a rel=\"noreferrer noopener\" href=\"https:\/\/unydevelopernetwork.com\/index.php\/2021\/04\/24\/membuat-penghitung-koin-sederhana-dengan-opencv\/\" target=\"_blank\">di sini<\/a><\/strong>, kita juga akan mencari kontur obyek yang dicari dan menggambarnya. Obyek yang akan kita cari adalah obyek berbentuk segi empat dengan berbagai bentuk \/ ukuran. Ukuran segi empat ini juga khas yakni simetris, sehingga kita bisa menyempitkan proses pencarian kontur ke segiempat yang simetris (meskipun dalam perspektif yang berbeda). <\/p>\n\n\n\n<p>Untuk melakukan hal ini, pertama kita akan menggunakan fungsi <strong>findContours()<\/strong>. Dari fungsi ini kita bisa memperoleh kontur yang akan kita cari. Oleh karena itu, kita tambahkan kode berikut terlebih dahulu.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(cnts, _) = cv.findContours(edgeDet.copy(), cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)<\/code><\/pre>\n\n\n\n<p>Setelah kita memperoleh data dari kontur yang kita cari, sekarang kita coba urutkan data tersebut dengan menggunakan fungsi <strong>sorted()<\/strong>. Tambahkan kode berikut ini.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cnts = sorted(cnts, key = cv.contourArea, reverse = True)&#91;:30]<\/code><\/pre>\n\n\n\n<p>Nah, setelah sampai di sini, saatnya kita menggambar area kontur yang sudah diseleksi. Namun kita tahu, bahwa menggambar <em>rectangle<\/em> bukanlah sesuatu hal yang mudah. Oleh karena itu, kita gunakan kode berikut ini untuk menggambar <em>rectangle<\/em> pada area kontur yang sudah diseleksi. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NumberPlateCnt = None\n\ncount = 0\nfor c in cnts:\n        peri = cv.arcLength(c, True)\n        approx = cv.approxPolyDP(c, 0.02 * peri, True)\n        if len(approx) == 4:\n            NumberPlateCnt = approx\n            break\n\ncv.drawContours(image, &#91;NumberPlateCnt], -1, (0,255,0), 3)<\/code><\/pre>\n\n\n\n<p>Terakhir kita tambahkan fungsi <strong>imshow()<\/strong> untuk melihat hasilnya.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cv.imshow(\"Plat Nomer Yang Terdeteksi\", image)<\/code><\/pre>\n\n\n\n<p>Saat kita jalankan program kita, maka akan menampilkan hasil seperti tangkapan layar di bawah ini.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-10-700x534.png\" alt=\"\" class=\"wp-image-986\" width=\"552\" height=\"421\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-10-700x534.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-10-300x229.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-10-768x586.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-10.png 804w\" sizes=\"auto, (max-width: 552px) 100vw, 552px\" \/><figcaption>Hasil dari menggambar rectangle pada kontur yang terdeteksi<\/figcaption><\/figure><\/div>\n\n\n\n<p>Cukup menarik bukan? sekarang kita beralih ke tahap terakhir, yakni tahap menyimpan hasil analisis<\/p>\n\n\n\n<p><strong>SCRIPT AKHIR TAHAP MENCARI MENCARI KONTUR DAN MENGGAMBARNYA<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2 as cv\nimport imutils as im\n\nimage = cv.imread('contohmobil.jpg')\nimage = im.resize(image, width=500)\ncv.imshow(\"Gambar Asli\", image)\n\ngray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)\ncv.imshow(\"Gambar Grayscale\", gray)\n\nblur = cv.bilateralFilter(gray, 11, 17, 17)\ncv.imshow(\"Bilateral Filter\", blur)\n\nedgeDet = cv.Canny(blur, 170, 200)\ncv.imshow(\"Deteksi Tepi\", edgeDet)\n\n(cnts, _) = cv.findContours(edgeDet.copy(), cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)\ncnts = sorted(cnts, key = cv.contourArea, reverse = True)&#91;:30]\n\nNumberPlateCnt = None\n\ncount = 0\nfor c in cnts:\n        peri = cv.arcLength(c, True)\n        approx = cv.approxPolyDP(c, 0.02 * peri, True)\n        if len(approx) == 4:\n            NumberPlateCnt = approx\n            break\n\ncv.drawContours(image, &#91;NumberPlateCnt], -1, (0,255,0), 3)\ncv.imshow(\"Plat Nomer Yang Terdeteksi\", image)\n\ncv.waitKey(0)\ncv.destroyAllWindows()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Menyimpan Gambar Hasil Deteksi<\/h2>\n\n\n\n<p>Pada tahap terakhir ini kita akan menyimpan hasil deteksi. Jadi setelah gambar dimuat ke dalam program, kemudian dilakukan berbagai tahap pengolahan citra, dan dapat memperlihatkan hasil tentu saja hasilnya ini harus dapat kita simpan. Oleh karena itu, kita tambahkan satu fungsi lagi yakni <strong>imwrite(). <\/strong>Fungsi ini diletakkan sebelum fungsi <strong>imshow() <\/strong>paling terakhir. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cv.imwrite('hasildeteksi.jpg', image)<\/code><\/pre>\n\n\n\n<p>Selanjutnya, setelah kita jalankan program, maka gambar hasil deteksi akan otomatis tersimpan di dalam direktori tempat kita menyimpan <em>script<\/em> untuk mendeteksi plat nomer kendaraan ini.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"280\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-11-700x280.png\" alt=\"\" class=\"wp-image-987\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-11-700x280.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-11-300x120.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-11-768x307.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-11.png 1016w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption>Gambar hasil deteksi tersimpan dengan nama <strong>hasildeteksi.jpg<\/strong><\/figcaption><\/figure>\n\n\n\n<p>Nah, sampai di sini sebenarnya program sudah selesai kita buat, Namun Saya ingin menambahkan satu tahapan paling terakhir, yakni merampingkan <em>script<\/em> program.<\/p>\n\n\n\n<p><strong>SCRIPT AKHIR TAHAP MENYIMPAN GAMBAR HASIL DETEKSI<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2 as cv\nimport imutils as im\n\nimage = cv.imread('contohmobil.jpg')\nimage = im.resize(image, width=500)\ncv.imshow(\"Gambar Asli\", image)\n\ngray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)\ncv.imshow(\"Gambar Grayscale\", gray)\n\nblur = cv.bilateralFilter(gray, 11, 17, 17)\ncv.imshow(\"Bilateral Filter\", blur)\n\nedgeDet = cv.Canny(blur, 170, 200)\ncv.imshow(\"Deteksi Tepi\", edgeDet)\n\n(cnts, _) = cv.findContours(edgeDet.copy(), cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)\ncnts = sorted(cnts, key = cv.contourArea, reverse = True)&#91;:30]\n\nNumberPlateCnt = None\n\ncount = 0\nfor c in cnts:\n        peri = cv.arcLength(c, True)\n        approx = cv.approxPolyDP(c, 0.02 * peri, True)\n        if len(approx) == 4:\n            NumberPlateCnt = approx\n            break\n\ncv.drawContours(image, &#91;NumberPlateCnt], -1, (0,255,0), 3)\ncv.imwrite('hasildeteksi.jpg', image)\ncv.imshow(\"Plat Nomer Yang Terdeteksi\", image)\n\ncv.waitKey(0)\ncv.destroyAllWindows()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Merampingkan Script Program<\/h2>\n\n\n\n<p>Sebenarnya, merampingkan script program juga tidak tepat juga. Karena pada tahapan ini, kita hanya akan menghapus seluruh fungsi <strong>imshow()<\/strong> dan hanya meninggalkan fungsi <strong>imshow() <\/strong>paling akhir saja, yakni fungsi untuk menampilkan gambar hasil deteksi. Sehingga script hasil akhir setelah kita rampingkan adalah sebagai berikut.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2 as cv\nimport imutils as im\n\nimage = cv.imread('contohmobil.jpg')\nimage = im.resize(image, width=500)\n\ngray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)\n\nblur = cv.bilateralFilter(gray, 11, 17, 17)\n\nedgeDet = cv.Canny(blur, 170, 200)\n\n(cnts, _) = cv.findContours(edgeDet.copy(), cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)\ncnts = sorted(cnts, key = cv.contourArea, reverse = True)&#91;:30]\n\nNumberPlateCnt = None\n\ncount = 0\nfor c in cnts:\n        peri = cv.arcLength(c, True)\n        approx = cv.approxPolyDP(c, 0.02 * peri, True)\n        if len(approx) == 4:\n            NumberPlateCnt = approx\n            break\n\ncv.drawContours(image, &#91;NumberPlateCnt], -1, (0,255,0), 3)\ncv.imwrite('hasildeteksi.jpg', image)\ncv.imshow(\"Plat Nomer Yang Terdeteksi\", image)\n\ncv.waitKey(0)\ncv.destroyAllWindows()<\/code><\/pre>\n\n\n\n<p>Sehingga, ketika kita jalankan program, program hanya akan menampilkan gambar hasil deteksi saja.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"445\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-12-700x445.png\" alt=\"\" class=\"wp-image-988\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-12-700x445.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-12-300x191.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-12.png 716w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption>Program hanya menampilkan hasil deteksi saja.<\/figcaption><\/figure><\/div>\n\n\n\n<p>Baik, sampai di sini, project saya anggap benar-benar selesai.. ^_^. Tunggu postingan saya selanjutnya yang akan lebih membahas lebih dalam tentang topik ini. Yakni membaca huruf dan angka yang terdapat pada plat nomer kendaraan yang berhasil dideteksi.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Demikian postingan saya tentang\u00a0<strong>Membuat Deteksi Plat Nomer Kendaraan Sederhana Dengan OpenCV (Python).\u00a0<\/strong>Semoga postingan ini bermanfaat bagi Anda yang ingin belajar tentang OpenCV. Apabila Anda masih menemukan kendala dalam membuat program ini, Anda dapat meninggalkan pertanyan di kolom komentar. Jika Anda ingin mencuplik sebagian teks dari artikel ini, Saya mohon jangan lupa sertakan sumber dan penulisnya.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Terima Kasih\u2026. ^_^<\/h1>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>DOWNLOAD<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/cdn.unydevelopernetwork.com\/mobil_a.jpg\" target=\"_blank\" rel=\"noreferrer noopener\">Resource Gambar<\/a><\/li><li><a href=\"https:\/\/github.com\/milstrike\/SimpleOpenCVProject\/tree\/main\/pendeteksi-plat-nomer-kendaraan\" target=\"_blank\" rel=\"noreferrer noopener\">Project ::: Deteksi Plat Nomer Kendaraan<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 9<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Pada postingan sebelumnya, Saya telah menulis bagaimana cara membuat program pendeteksi dan penghitung koin sederhana dengan menggunakan OpenCV [lihat disini]. Nah, dengan menggunakan konsep yang hampir sama persis dengan postingan sebelumnya, kali&#8230;<\/p>\n","protected":false},"author":1,"featured_media":986,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[24,2],"tags":[298,296,297,305,302,295,72,304,25],"class_list":["post-972","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-tutorial","tag-computer-vision","tag-computervision","tag-cv","tag-detection","tag-koding","tag-opencv","tag-pemrograman","tag-pycharm","tag-python"],"featured_image_src":"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-10.png","author_info":{"display_name":"Muhammad Irfan Luthfi","author_link":"https:\/\/unydevelopernetwork.com\/index.php\/author\/admin\/"},"jetpack_featured_media_url":"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/05\/image-10.png","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/972","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/comments?post=972"}],"version-history":[{"count":3,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/972\/revisions"}],"predecessor-version":[{"id":989,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/972\/revisions\/989"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/media\/986"}],"wp:attachment":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/media?parent=972"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/categories?post=972"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/tags?post=972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}