{"id":952,"date":"2021-04-24T01:57:54","date_gmt":"2021-04-24T01:57:54","guid":{"rendered":"https:\/\/unydevelopernetwork.com\/?p=952"},"modified":"2021-07-09T15:48:56","modified_gmt":"2021-07-09T15:48:56","slug":"membuat-penghitung-koin-sederhana-dengan-opencv","status":"publish","type":"post","link":"https:\/\/unydevelopernetwork.com\/index.php\/2021\/04\/24\/membuat-penghitung-koin-sederhana-dengan-opencv\/","title":{"rendered":"Membuat Penghitung Koin Sederhana Dengan OpenCV"},"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><p>Selamat datang di Blogs UNYDeveloperNetwork. Pada postingan kali ini, Saya ingin berbagi dengan Anda sebuah projectr membuat program penghitung koin sederhana dengan menggunakan OpenCV. Bahasa pemrograman yang kita gunakan dalam project ini adalah Python. Tidak perlu berlama &#8211; lama lagi, baca post ini lebih lanjut untuk memulai project program penghitung koin sederhana dengan OpenCV.<\/p>\n<p><!--more--><\/p>\n<p>Sebelum memulai project ini, alangkah baiknya kita mulai dengan tool dan library apa sajakah yang Saya gunakan dalam project ini.<\/p>\n<ol>\n<li>Python versi 2.7.18<\/li>\n<li>OpenCV versi 4.1.0.25<\/li>\n<li>PyCharm Community Edition<\/li>\n<\/ol>\n<p>Setelah semua tool dan library siap, mari kita langsung mulai saja. Di sini, Saya asumsikan Anda sudah paham menggunakan PyCharm. Sehingga kita bisa langsung melewati tahap membuat project baru dengan menggunakan PyCharm.<\/p>\n<p><strong>Langkah Pertama.\u00a0<\/strong> Adalah membuat project baru. Oleh karena itu, buatlah satu project baru dengan nama\u00a0<strong>coinCounter<\/strong>.<\/p>\n<p><strong>Langkah Kedua.\u00a0<\/strong>Setelah project selesai dibuat, langkah selanjutnya adalah memasukkan gambar ke dalam project. Gambar yang digunakan dapat diunduh melalui tautan berikut <a href=\"https:\/\/unydevelopernetwork.com\/cdn\/coin_test.jpeg.\"><strong>ini.<\/strong><\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-955 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/3-300x300.jpeg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/3-300x300.jpeg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/3-700x700.jpeg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/3-150x150.jpeg 150w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/3-768x768.jpeg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/3.jpeg 1198w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Gambar koin yang akan digunakan dalam project<\/em><\/p>\n<p>Berikan nama gambar yang diimport ke dalam project:\u00a0<strong>coin_test.jpeg<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-956 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/3-300x172.jpg\" alt=\"\" width=\"300\" height=\"172\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/3-300x172.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/3.jpg 364w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Gambar koin yang sudah disisipkan ke dalam<\/em> <em>project<\/em><\/p>\n<p><strong>Langkah Ketiga.\u00a0<\/strong>Buat script Python baru dengan nama\u00a0<strong>coin_counter.py<\/strong> dan letakkan satu direktori dengan gambar yang baru saja diimport.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-957 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/4-300x116.jpg\" alt=\"\" width=\"300\" height=\"116\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/4-300x116.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/4.jpg 366w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Script coin_counter.py diletakkan di dalam project<\/em>.<\/p>\n<p>Setelah kita menyelesaikan ketiga tahap di atas, kita siap untuk membuat program penghitung koin sederhana kita.<\/p>\n<h2>Memuat Gambar Ke Program<\/h2>\n<p>Pertama, kita harus mengimport library openCV ke dalam\u00a0<em>script<\/em> kita. Ketikkan kode berikut ini ke dalam\u00a0<em>script<\/em>.<\/p>\n<pre>import cv2 as cv<\/pre>\n<p>Selanjutnya, kita muat gambar yang sudah diimport ke dalam project dengan menggunakan fungsi\u00a0<strong>imread()<\/strong>.<\/p>\n<pre>img = cv.imread(\"coin_test.jpeg\")<\/pre>\n<p>Kemudian kita coba tampilkan gambar yang sudah dimuat tadi dengan menggunakan fungsi\u00a0<strong>imshow().\u00a0<\/strong><\/p>\n<pre>cv.imshow(<strong>\"Show Images\"<\/strong>, img)<\/pre>\n<p>Terakhir, kita tambahkan fungsi\u00a0<strong>waitKey()<\/strong> dan\u00a0<strong>destroyAllWindows()<\/strong> untuk menghandle visibilitas window.<\/p>\n<pre>cv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Pada akhir tahap ini, bentuk\u00a0<em>script<\/em> kita adalah seperti ini:<\/p>\n<pre>import cv2 as cv\r\n\r\nimg = cv.imread(\"coin_test.jpeg\")\r\ncv.imshow(\"Original Images\", img)\r\n\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Ketika\u00a0<em>script<\/em> tersebut dijalankan, maka akan tampak seperti tangkapan layar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-958 size-large\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/5-700x394.jpg\" alt=\"\" width=\"640\" height=\"360\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/5-700x394.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/5-300x169.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/5-768x432.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/5-1536x864.jpg 1536w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/5.jpg 1920w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Gambar Koin yang berhasil dimuat dengan\u00a0<strong>openCV<\/strong><\/em><\/p>\n<p>Dapat kita lihat pada tangkapan layar di atas, gambar koin yang dimuat masih terlalu besar. Oleh karena itu, pada tahap berikutnya kita akan melakukan resize terhadap gambar tersebut.<\/p>\n<h2>Mengubah Dimensi Gambar<\/h2>\n<p>Pada tahap ini kita akan mengubah dimensi gambar supaya gambar tidak terlalu besar ketika ditampilkan di layar monitor. Untuk mengubah dimensi gambar, kita akan menggunakan fungsi\u00a0<strong>resize()<\/strong>. Namun, sebelum kita dapat menggunakan fungsi ini, terlebih dahulu kita harus mendapat\u00a0<strong>image properties<\/strong> yang berupa\u00a0<strong>width\u00a0<\/strong>dan\u00a0<strong>height<\/strong>. Setelah kita mendapatkan image properties tersebut, kita dapat mengubah dimensi gambar menjadi lebih besar atau lebih kecil. Untuk memperoleh image properties ini, kita menggunakan fungsi\u00a0<strong>shape()<\/strong>.<\/p>\n<p>Kita buat terlebih dahulu variabel untuk menyimpan height dan width dari gambar, baru kemudian dengan menggunakan fungsi shape(), kita ekstrak informasi height dan width dari gambar. Ketikkan kode berikut ini untuk melakukannya.<\/p>\n<pre>height, width = img.shape[:2]<\/pre>\n<p>Dengan menggunakan kode di atas kita sudah bisa mendapatkan nilai height dan width dari sebuah gambar. Selanjutnya, kita akan mengubah dimensi gambar menjadi lebih kecil dari gambar sebelumnya. Hasil ubahan dimensi gambar tersebut juga kita simpan sebagai variabel yang nantinya akan kita gunakan di tahap &#8211; tahap selanjutnya. Gunakan kode berikut untuk melakukannya.<\/p>\n<pre>res = cv.resize(img,(width\/2, height\/2), interpolation = cv.INTER_LINEAR)<\/pre>\n<p>Pada kode di atas, Saya mengubah dimensi gambar menjadi setengah lebih kecil dari gambar asilnya serta untuk\u00a0<em>flags<\/em> interpolationnya, saya set ke INTER_LINEAR yang merupakan interpolation standar untuk mengubah dimensi lebih besar atau lebih kecil.<\/p>\n<p>Untuk melihat hasil pengubahan dimensi ini, tambahkan satu kode\u00a0<strong>imshow()<\/strong> untuk menampilkan hasilnya. Sehingga kondisi akhir\u00a0<em>script<\/em> adalah seperti di bawah ini.<\/p>\n<pre>import cv2 as cv\r\n\r\nimg = cv.imread(\"coin_test.jpeg\")\r\ncv.imshow(\"Original Images\", img)\r\n\r\nheight, width = img.shape[:2]\r\nres = cv.resize(img,(width\/2, height\/2), interpolation = cv.INTER_LINEAR)\r\ncv.imshow(\"Resized Images\", res)\r\n\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Ketika kita jalankan\u00a0<em>script\u00a0<\/em>di atas, hasilnya adalah seperti tangkapan layar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-961 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/6-700x394.jpg\" alt=\"\" width=\"640\" height=\"360\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/6-700x394.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/6-300x169.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/6-768x432.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/6-1536x864.jpg 1536w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/6.jpg 1920w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Dua buah penampil gambar dengan ukuran yang berbeda<\/em><\/p>\n<p>Setelah kita berhasil mengubah ukuran dimensi gambar, langkah selanjutnya adalah proses untuk menghilangkan kontur gambar. Ada beberapa langkah yang akan dilakukan dan mari kita simak satu persatu.<\/p>\n<h2>Mengubah Color Space gambar menjadi Grayscale<\/h2>\n<p>Langkah pertama dalam proses menghilangkan kontur gambar adalah mengubah gambar yang tadinya berwarna menjadi grayscale. Untuk melakukannya, kita akan menggunakan fungsi\u00a0<strong>cvtColor().\u00a0<\/strong>Gambar yang digunakan pun adalah gambar hasil resize. Sehingga kode untuk mengubah gambar menjadi grayscale adalah.<\/p>\n<pre>grey = cv.cvtColor(res, cv.COLOR_BGR2GRAY)<\/pre>\n<p>Dapat kita lihat pada kode di atas, kita sudah menggunakan\u00a0<strong>res<\/strong> sebagai sumber gambar karena gambar ini sudah diubah dimensinya menjadi lebih kecil.\u00a0 Untuk dapat melihat hasilnya, tambahkan fungsi\u00a0<strong>imshow()\u00a0<\/strong>sehingga hasil akhir\u00a0<em>script<\/em> sampai di tahap ini adalah.<\/p>\n<pre>import cv2 as cv\r\n\r\nimg = cv.imread(\"coin_test.jpeg\")\r\n\r\nheight, width = img.shape[:2]\r\nres = cv.resize(img,(width\/2, height\/2), interpolation = cv.INTER_LINEAR)\r\ncv.imshow(\"Resized Images\", res)\r\n\r\ngrey = cv.cvtColor(res, cv.COLOR_BGR2GRAY)\r\ncv.imshow(\"Grayscale Images\", grey)\r\n\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Dari kode di atas, kira dapat melihat bahwa Saya menghapus\u00a0<strong>imshow()<\/strong> untuk menampilkan gambar original. Mengapa? Karena gambar tersebut sudah dapat diwakili oleh\u00a0<strong>imshow()<\/strong> pada gambar yang sudah diresize, dan juga ukuran gambar yang sudah diresize lebih kecil daripada gambar originalnya.<\/p>\n<p>Ketika\u00a0<em>script<\/em> di atas dijalankan, maka hasilnya adalah seperti tangkapan layar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-962 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/7-700x451.jpg\" alt=\"\" width=\"640\" height=\"412\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/7-700x451.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/7-300x193.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/7-768x494.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/7.jpg 1387w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Hasil gambar setelah diubah menjadi grayscale<\/em><\/p>\n<p>Setelah gambar menjadi\u00a0<em>grayscale<\/em>, langkah selanjutnya untuk lebih menghilangkan kontur pada gambar, kita akan memblur gambar tersebut. Oleh karena itu, langkah selanjutnya adalah memberikan efek blur pada gambar.<\/p>\n<h2>Memberikan Filter Blur Pada Gambar<\/h2>\n<p>Tujuan dari langkah ini adalah &#8220;makin membuat buram&#8221; gambar sehingga akan menyisakan kontur terluarnya saja. Sehingga, untuk melakukannya kita harus menggunakan filter blur. Ada beberapa filter blur yang dapat kita gunakan, namun khusus pada kasus ini kita gunakan filter\u00a0<strong>GaussianBlur()<\/strong>. Untuk memberikan efek blur ini, ketikkan kode berikut.<\/p>\n<pre>blurred = cv.GaussianBlur(grey, (17, 17), 0)<\/pre>\n<p>Masing-masing <em>flags<\/em> pada parameter filter GaussianBlur memiliki arti tersendiri yang akan kita bahas di postingan yang lain. Karena jika kita bahas di postingan ini, ditakutkan post akan semakin panjang.<\/p>\n<p>Dapat kita lihat pada baris kode di atas, bahwa gambar hasi pemberian filter blur disimpan di dalam sebuah variabel. Mengapa? Ya, karena gambar hasil &#8220;pembluran&#8221; ini akan diproses lebih lanjut hingga\u00a0<em>script <\/em>dapat mendeteksi obyek dan menghitungnya. Namun, jika kita ingin menampilkannya secara terpisah, maka kita bisa menggunakan fungsi\u00a0<strong>imshow()<\/strong> seperti halnya langkah-langkah sebelumnya.<\/p>\n<p>Hasil akhir\u00a0<em>script<\/em> hingga tahap ini adalah sebagai berikut.<\/p>\n<pre>import cv2 as cv\r\n\r\nimg = cv.imread(\"coin_test.jpeg\")\r\n\r\nheight, width = img.shape[:2]\r\nres = cv.resize(img,(width\/2, height\/2), interpolation = cv.INTER_LINEAR)\r\ncv.imshow(\"Resized Images\", res)\r\n\r\ngrey = cv.cvtColor(res, cv.COLOR_BGR2GRAY)\r\ncv.imshow(\"Grayscale Images\", grey)\r\n\r\nblurred = cv.GaussianBlur(grey, (17, 17), 0)\r\ncv.imshow(\"Blurred Images\", blurred)\r\n\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Sekarang, mari kita coba jalankan\u00a0<em>script\u00a0<\/em>di atas. Ketika script di atas dijalankan, maka menghasilkan seperti tangkapan layar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-963 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/8-700x297.jpg\" alt=\"\" width=\"640\" height=\"272\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/8-700x297.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/8-300x127.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/8-768x325.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/8-1536x651.jpg 1536w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/8.jpg 1855w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Hasil gambar setelah diberikan filter GaussianBlur<\/em><\/p>\n<p>Dari tangkapan layar di atas, kita dapat melihat hasil tiga gambar yang berbeda. Pada tampilan gambar pertama, merupakan gambar asli yang di ubah dimensinya, pada tampilan gambar kedua, merupakan gambar yang telah diubah menjadi gambar grayscale, dan pada tampilan gambar ketiga, merupakan gambar yang telah diberikan filter GaussianBlur.<\/p>\n<p>Apakah langkah-langkahnya hanya sampai di sini saja? Tidak, belum selesai. Bahkan kita juga belum bisa mendeteksi keberadaan &#8220;uang koin&#8221; di dalam gambar ini. Oleh karena itu, kita akan berlanjut ke tahapan selanjutnya yakni mendeteksi kontur untuk menentukan tepi obyek.<\/p>\n<h2>Mendeteksi Contour \/ Edge<\/h2>\n<p>Pada tahapan ini, kita akan mencoba mendeteksi kontur untuk menemukan tepian obyek. Idenya adalah, semakin sederhana bentuk suatu obyek (misal berbentuk lingkaran atau kotak) maka, kontur yang terdeteksi pun sederhana, Sehingga dapat dihitung ada berapa\u00a0<em>shape<\/em> yang terdeteksi di dalam gambar tersebut. Untuk dapat melakukan hal ini, kita akan menggunakan fungsi\u00a0<strong>canny()<\/strong> dan\u00a0<strong>findContours()<\/strong>. Pertama, kita mencari outline dari objek yang sudah kita blur tadi. Pada tahap ini kita menggunakan fungsi\u00a0<strong>canny()<\/strong>. Oleh karena itu, tambahkan baris kode berikut ke dalam\u00a0<em>script<\/em>.<\/p>\n<pre>outline = cv.Canny(blurred, 30, 150)<\/pre>\n<p>Setelah kita tambahkan baris kode di atas, kita sudah dapat menambahkan outline pada obyek yang sudah kita blur. Tujuannya untuk menemukan\u00a0<em>shape<\/em> paling sederhana dari obyek. Namun, sampai di sini, belum cukup. Kita harus mencari kontur outline hasil dari fungsi\u00a0<strong>canny()<\/strong>. Untuk itu, kita gunakan fungsi\u00a0<strong>findContours()<\/strong>. Tambahkan kode berikut ke dalam\u00a0<em>script<\/em>.<\/p>\n<pre>(cnts, _) = cv.findContours(outline, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)<\/pre>\n<p>Dari fungsi di atas, kita mencoba mencari kontur terluar suatu obyek yang sudah dideteksi oleh fungsi\u00a0<strong>canny()<\/strong> dan menggunakan pendekatan pencarian kontur paling sederhana untuk mempercepat proses.<\/p>\n<p>Nah, sampai di sini, kita sudah bisa memperoleh ada berapa koin yang terdeteksi pada gambar tersebut. Untuk mengetahui berapa jumlah koin yang terdeteksi, kita panggil fungsi\u00a0<strong>print<\/strong> untk mencetak panjang variabel <strong>cnts<\/strong>.<\/p>\n<pre>print(\"Jumlah koin: %i \" % len(cnts))<\/pre>\n<p>Sehingga, sampai di tahap ini\u00a0<em>script<\/em> yang sudah kita buat adalah seperti di bawah ini.<\/p>\n<pre>import cv2 as cv\r\n\r\nimg = cv.imread(\"coin_test.jpeg\")\r\n\r\nheight, width = img.shape[:2]\r\nres = cv.resize(img,(width\/2, height\/2), interpolation = cv.INTER_LINEAR)\r\ncv.imshow(\"Resized Images\", res)\r\n\r\ngrey = cv.cvtColor(res, cv.COLOR_BGR2GRAY)\r\ncv.imshow(\"Grayscale Images\", grey)\r\n\r\nblurred = cv.GaussianBlur(grey, (17, 17), 0)\r\ncv.imshow(\"Blurred Images\", blurred)\r\n\r\noutline = cv.Canny(blurred, 30, 150)\r\n(cnts, _) = cv.findContours(outline, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)\r\n\r\nprint(\"Jumlah koin: %i \" % len(cnts))\r\n\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Apabila kita jalankan, maka pada<em> console<\/em> akan menampilkan jumlah koin seperti tangkapan layar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-964 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/9-700x557.jpg\" alt=\"\" width=\"640\" height=\"509\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/9-700x557.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/9-300x239.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/9-768x611.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/9.jpg 800w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Jumlah koin ditampilkan melalui console<\/em><\/p>\n<p>Sampai di tahap ini, sebenarnya program kita sudah jadi. Namun, kita belum mengetahuo bagaimana program mendeteksi koin. Untuk itu, kita lanjutkan ke tahap selanjutnya yakni menggambar garis pada kontur.<\/p>\n<h2>Menggambar Garis<\/h2>\n<p>Pada tahap ini, kita akan lebih menyempurnakan program yang sudah kita buat. Menyempurnakan di sini maksudnya adalah menambahkan satu baris kode lagi yang memungkinkan kita untuk melihat hasil akhir dari program ini. Pada tahapan sebelumnya kita memang sudah mendapatkan hasil akhir berupa jumlah koin yang terdeteksi pada suatu gambar. Namun, kita belum benar &#8211; benar mengetahui apa yang terjadi pada gambar yang sudah diolah dengan menggunakan openCV hingga program dapat menghitung koin yang terdapat pada gambar. Oleh karena itu, di tahap ini kita akan menambahkan satu tampilan lagi yang isinya adalah berupa gambar hasil filter Gaussian Blur ditambah dengan garis tampak yang mengikuti kontur sederhana dari fungsi\u00a0<strong>findContours()<\/strong>. Tambahkan satu baris berikut ini pada\u00a0<em>script<\/em>.<\/p>\n<pre>res = cv.drawContours(res, cnts, -1, (0, 255, 0), 2)<\/pre>\n<p>Sehingga pada tahap ini, kode pada\u00a0<em>script<\/em> sudah menjadi seperti ini.<\/p>\n<pre>import cv2 as cv\r\n\r\nimg = cv.imread(\"coin_test.jpeg\")\r\n\r\nheight, width = img.shape[:2]\r\nres = cv.resize(img,(width\/2, height\/2), interpolation = cv.INTER_LINEAR)\r\ncv.imshow(\"Resized Images\", res)\r\n\r\ngrey = cv.cvtColor(res, cv.COLOR_BGR2GRAY)\r\ncv.imshow(\"Grayscale Images\", grey)\r\n\r\nblurred = cv.GaussianBlur(grey, (17, 17), 0)\r\ncv.imshow(\"Blurred Images\", blurred)\r\n\r\noutline = cv.Canny(blurred, 30, 150)\r\n(cnts, _) = cv.findContours(outline, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)\r\n\r\nres = cv.drawContours(res, cnts, -1, (0, 255, 0), 2)\r\ncv.imshow(\"Final Results\", res)\r\n\r\nprint(\"Jumlah koin: %i \" % len(cnts))\r\n\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Dapat Anda lihat, pada\u00a0<em>script<\/em> di atas, saya menambahkan fungsi\u00a0<strong>drawContours()<\/strong> yang berfungsi untuk menggambar garis disekitar kontur sederhana yang sudah ditemukan dan digambar secara maya oleh\u00a0fungsi\u00a0<strong>findContours()<\/strong>. Warna yang digunakan untuk garis tersebut adalah RGB hijau sehingga kontras dengan warna gambar yang diolah. Ketika\u00a0<em>script<\/em> di atas dijalankan, maka hasilnya adalah seperti tangkapan layar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-965 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/10-700x467.jpg\" alt=\"\" width=\"640\" height=\"427\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/10-700x467.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/10-300x200.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/10-768x512.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/10-1536x1025.jpg 1536w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/10.jpg 1553w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Setelah diberikan garis warna hijau, kini tampak hasil akhir koin yang terdeteksi<\/em><\/p>\n<p>Nah, sampai di sini nih, program kita sudah makin sempurna. Tapi, kita akan menyempurnakannya lagi yakni dengan menambahkan teks hasil deteksi koin ke dalam gambarnya langsung. Bagaimana caranya? Ikuti tahap selanjutnya.<\/p>\n<h2>Menuliskan Teks Pada Gambar<\/h2>\n<p>Pada langkah ini, kita hanya akan secara khusus menambahkan teks pada gambar. Bagaimana caranya? tambahkan kode di bawah ini pada\u00a0<em>script<\/em>. Letakkan sebelum\u00a0<strong>imshow()<\/strong> terakhir.<\/p>\n<pre>res = cv.putText(res, \"Jumlah koin: %i \" % len(cnts), (10,30), cv.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 2, cv.LINE_AA)<\/pre>\n<p>Sehingga\u00a0<em>script<\/em> terakhir pada tahap ini adalah sebagai berikut.<\/p>\n<pre>import cv2 as cv\r\n\r\nimg = cv.imread(\"coin_test.jpeg\")\r\n\r\nheight, width = img.shape[:2]\r\nres = cv.resize(img,(width\/2, height\/2), interpolation = cv.INTER_LINEAR)\r\ncv.imshow(\"Resized Images\", res)\r\n\r\ngrey = cv.cvtColor(res, cv.COLOR_BGR2GRAY)\r\ncv.imshow(\"Grayscale Images\", grey)\r\n\r\nblurred = cv.GaussianBlur(grey, (17, 17), 0)\r\ncv.imshow(\"Blurred Images\", blurred)\r\n\r\noutline = cv.Canny(blurred, 30, 150)\r\n(cnts, _) = cv.findContours(outline, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)\r\n\r\nres = cv.drawContours(res, cnts, -1, (0, 255, 0), 2)\r\nres = cv.putText(res, \"Jumlah koin: %i \" % len(cnts), (10,30), cv.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 2, cv.LINE_AA)\r\ncv.imshow(\"Final Results\", res)\r\n\r\nprint(\"Jumlah koin: %i \" % len(cnts))\r\n\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Kemudian, apabila\u00a0<em>script<\/em> di atas kita jalankan maka tampilannya akan menjadi seperti tangkapan layar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-966 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/11-700x468.jpg\" alt=\"\" width=\"640\" height=\"428\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/11-700x468.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/11-300x200.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/11-768x513.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/11-1536x1026.jpg 1536w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/11.jpg 1552w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Tampilan hasil program setelah ditambah script menulis teks pada gambar<\/em><\/p>\n<p>Akhirnya kita hampir tiba di tahap yang benar &#8211; benar akhir. Yakni merapikan program. Untuk itu, kita lanjutkan ke tahap selanjutnya.<\/p>\n<h2>Merapikan Program<\/h2>\n<p>Pada tahap terakhir ini, selain kita akan merapikan program, kita juga akan menyimpan gambar hasil analisis ke dalam komputer kita. Pertama, kita akan merapikan program terlebih dahulu. Untuk itu, kita akan menghapus seluruh fungsi\u00a0<strong>imshow()<\/strong> kecuali fungsi\u00a0<strong>imshow()<\/strong> paling akhir. Kita juga akan menghapus fungsi\u00a0<strong>print()<\/strong> sehingga tidak ada lagi pesan yang ditampilkan di\u00a0<em>console<\/em>. Hasil akhir\u00a0<em>script<\/em> setelah dirapikan adalah sebagai berikut.<\/p>\n<pre>import cv2 as cv\r\n\r\nimg = cv.imread(\"coin_test.jpeg\")\r\n\r\nheight, width = img.shape[:2]\r\nres = cv.resize(img,(width\/2, height\/2), interpolation = cv.INTER_LINEAR)\r\n\r\ngrey = cv.cvtColor(res, cv.COLOR_BGR2GRAY)\r\n\r\nblurred = cv.GaussianBlur(grey, (17, 17), 0)\r\n\r\noutline = cv.Canny(blurred, 30, 150)\r\n(cnts, _) = cv.findContours(outline, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)\r\n\r\nres = cv.drawContours(res, cnts, -1, (0, 255, 0), 2)\r\nres = cv.putText(res, \"Jumlah koin: %i \" % len(cnts), (10,30), cv.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 2, cv.LINE_AA)\r\ncv.imshow(\"Final Results\", res)\r\n\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Selanjutnya, kita akan menyimpan hasil akhir analisis gambar ke dalam komputer kita. Oleh karena itu, kita memerlukan satu fungsi\u00a0yakni\u00a0<strong>imwrite().<\/strong> Tambahkan kode berikut sebelum\u00a0fungsi\u00a0<strong>imshow().<\/strong><\/p>\n<pre>cv.imwrite('hasildeteksi.jpeg', res)<\/pre>\n<p>Sehingga, secara utuh,\u00a0<em>script<\/em> kita menjadi seperti di bawah ini.<\/p>\n<pre>import cv2 as cv\r\n\r\nimg = cv.imread(\"coin_test.jpeg\")\r\n\r\nheight, width = img.shape[:2]\r\nres = cv.resize(img,(width\/2, height\/2), interpolation = cv.INTER_LINEAR)\r\n\r\ngrey = cv.cvtColor(res, cv.COLOR_BGR2GRAY)\r\n\r\nblurred = cv.GaussianBlur(grey, (17, 17), 0)\r\n\r\noutline = cv.Canny(blurred, 30, 150)\r\n(cnts, _) = cv.findContours(outline, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)\r\n\r\nres = cv.drawContours(res, cnts, -1, (0, 255, 0), 2)\r\nres = cv.putText(res, \"Jumlah koin: %i \" % len(cnts), (10,30), cv.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 2, cv.LINE_AA)\r\ncv.imwrite('hasildeteksi.jpeg', res)\r\ncv.imshow(\"Final Results\", res)\r\n\r\ncv.waitKey(0)\r\ncv.destroyAllWindows()<\/pre>\n<p>Terakhir, ketika\u00a0<em>script<\/em> di atas dijalankan, maka akan diperoleh tampilan seperti tangkapan layar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-967 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/12-700x551.jpg\" alt=\"\" width=\"640\" height=\"504\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/12-700x551.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/12-300x236.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/12-768x605.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/12.jpg 824w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p style=\"text-align: center;\"><em>Hasil akhir program pendeteksi dan penghitung koin sederhana<\/em><\/p>\n<p>Pada tangkapan layar di atas, kita dapat melihat juga bahwa ada satu file gambar baru yang dihasilkan. Yakni\u00a0<strong>hasildeteksi.jpeg<\/strong>. Apabila file tersebut kita buka, maka ditampilkan file gambar asli lengkap dengan hasil analisisnya.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-968 aligncenter\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/13.jpg\" alt=\"\" width=\"659\" height=\"351\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/13.jpg 659w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/13-300x160.jpg 300w\" sizes=\"auto, (max-width: 659px) 100vw, 659px\" \/><\/p>\n<p style=\"text-align: center;\">Gambar\u00a0<strong>hasildeteksi.jpeg<\/strong><\/p>\n<p>Baiklah, sampai di sini program kita telah selesai dibuat.<\/p>\n<hr \/>\n<p>Demikian postingan saya tentang <strong>Membuat Penghitung Koin Sederhana Dengan OpenCV.\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<h1>Terima Kasih&#8230;. ^_^<\/h1>\n<hr \/>\n<p><strong>DOWNLOAD<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/unydevelopernetwork.com\/cdn\/coin_test.jpeg.\">Resource Gambar<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/milstrike\/SimpleOpenCVProject\/tree\/main\/coinCounter\" target=\"_blank\" rel=\"noopener\">Project ::: Coin Counter<\/a><\/li>\n<\/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>Selamat datang di Blogs UNYDeveloperNetwork. Pada postingan kali ini, Saya ingin berbagi dengan Anda sebuah projectr membuat program penghitung koin sederhana dengan menggunakan OpenCV. Bahasa pemrograman yang kita gunakan dalam project ini&#8230;<\/p>\n","protected":false},"author":1,"featured_media":967,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[24,2],"tags":[299,139,300,301,298,296,297,302,295,72,59,25],"class_list":["post-952","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-tutorial","tag-artificial-intelligence","tag-coding","tag-coin-counter","tag-coin-detection","tag-computer-vision","tag-computervision","tag-cv","tag-koding","tag-opencv","tag-pemrograman","tag-programming","tag-python"],"featured_image_src":"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2021\/04\/12.jpg","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\/04\/12.jpg","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/952","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=952"}],"version-history":[{"count":3,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/952\/revisions"}],"predecessor-version":[{"id":971,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/952\/revisions\/971"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/media\/967"}],"wp:attachment":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/media?parent=952"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/categories?post=952"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/tags?post=952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}