Merekognisi Bentuk Objek Geometri Dua Dimensi dengan Menggunakan OpenCV

Reading Time: 6 minutes

Selamat datang di UNYDeveloperNetwork. Pada postingan kali ini, kita akan bermain lagi dengan Computer Vision. Ya, sesuai dengan judul, kita akan menggunakan openCV untuk merekognisi bentuk suatu objek dengan menggunakan OpenCV. Bagaimanakah caranya? Mari kita simak artikel berikut dengan seksama.

OpenCV adalah sebuah library yang sangat powerful yang fokusnya adalah melakukan tugas-tugas Computer Vision secara realtime. Selain itu juga open source, sehingga siapapun dapat menggunakannya tanpa harus membayar. Nah, begitu pula dengan postingan kali ini. Postingan kali ini akan memanfaatkan power dari OpenCV tersebut untuk melakukan satu tugas; yakni merekognisi bentuk objek geometri dua dimensi. Keluaran dari project kita kali ini adalah seperti tangkapan layar di bawah ini.

Keluaran dari Project Rekognisi Bentuk Geometri 2 dimensi sederhana

Tertarik untuk melanjutkan? Mari kita lanjutkan.

Sebelum kita mulai dengan project ini, ada baiknya kita menyiapkan alat dan bahannya terlebih dahulu. Untuk alat yang digunakan dalam project ini adalah PyCharm 2022.2.3 Community Edition. Sedangkan untuk bahan-bahannya adalah sebagai berikut:

  • Python versi 3.10
  • opencv-python versi 4.6.0.66
  • numpy 1.23.4

Setelah siap dengan alat dan bahannya, mari kita mulai koding. Namun sebelumnya kita akan bahas terlebih dahulu konsep dan alur programnya mulai dari menerima input, memproses input, hingga memperoleh output. Secara sederhananya, alur program yang akan dibuat adalah sebagai berikut:

  1. Import library ke dalam script
  2. Import gambar dengan menggunakan openCV
  3. Ubah gambar ke dalam mode grayscale
  4. Atur threshold pada gambar yang sudah dalam mode grayscale dan cari tahu konturnya
  5. Lakukan iterasi pada kontur yang telah ditemukan dan hitung jumlah konturnya
  6. Gambar kontur yang ditemukan dengan garis untuk menegaskan kontur yang ditemukan
  7. Dalam melakukan iterasi, cari tahu titik pusat bentuk geometrinya
  8. Klasifikasikan bentuk yang terdeteksi berdasarkan jumlah titik kontur yang ditemukan
  9. Berikan label pada bentuk geometri yang telah ditemukan klasifikasinya
  10. Tampilkan keluaran

Secara keseluruhan ada sepuluh tahapan yang harus dilalui dari mengimport gambar hingga memperoleh. Kita akan bahas satu persatu.

1. Import library ke dalam script

Untuk melakukan import library ke dalam script, dapat menggunakan baris kode berikut ini.

import cv2

2. Import gambar dengan menggunakan openCV

Setelah melakukan import library, kita dapat mengimport gambar yang akan kita analisis dengan menggunakan openCV. Berikut ini adalah baris kodenya.

img = cv2.imread('###nama_file###')

Pada baris ini, kita dapat memasukkan nama file gambar kita lengkap beserta ekstensinya ke dalam ###nama_file###. Untuk format gambar disarankan menggunakan format png. Berikut adalah contoh implementasi baris kode lengkap dengan nama filenya:

img = cv2.imread('shape_testing.png')

3. Ubah gambar ke dalam mode grayscale

Tahapan selanjutnya adalah mengubah gambar ke dalam mode grayscale. Hal ini penting dilakukan agar saat proses rekognisi tidak tergangggu oleh banyaknya channel warna. Keluaran dari mengubah gambar ke dalam mode grayscale ini disimpan dalam sebuah variabel yang nantinya akan dipanggil ketika proses mencari kontur. Untuk mengubah gambar ke dalam mode grayscale dapat menggunakan baris kode berikut ini.

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Jika kita mencoba menampilkan gambar hasil olahan di tahap ini maka akan seperti tangkapan layar berikut ini.

Gambar original dan gambar hasil olahan ke dalam bentuk grayscale

4. Atur threshold pada gambar yang sudah dalam mode grayscale dan cari tahu konturnya

Tahap keempat adalah mengatur treshold pada gambar yang sudah dalam mode grayscale sehingga memungkinkan proses pencarian kontur dilakukan. Untuk mengatur threshold pada gambar dapat menggunakan baris kode berikut ini.

_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

Setelah mengatur threshold, proses dilanjutkan dengan mencari kontur pada gambar dengan menggunakan baris kode berikut ini.

contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

5. Lakukan iterasi pada kontur yang telah ditemukan

Tahapan selanjutnya adalah proses iterasi untuk menghitung jumlah konturnya. Untuk itu, gunakan blok kode berikut ini

i = 0


for contour in contours:

    if i == 0:
        i = 1
        continue


    approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)

6. Gambar kontur yang ditemukan dengan garis untuk menegaskan kontur yang ditemukan

Setelah menemukan dan mendapatkan jumlah kontur dari suatu objek, kita akan menggambarkan sebuah garis yang menghubungkan antar kontur untuk menegaskan kontur yang sudah ditemukan. Untuk melakukannya gunakan baris kode berikut ini.

cv2.drawContours(img, [contour], 0, (0, 0, 255), 5)

7. Dalam melakukan iterasi, cari tahu titik pusat bentuk geometrinya

Selama melakukan proses interasi, kita juga harus mencari tahu titik pusat geometrinya sebagai titik awal untuk menuliskan label bentuk geometrinya. Untuk mencari tahu titik pusat geometrinya, dapat menggunakan blok kode berikut ini.

M = cv2.moments(contour)
if M['m00'] != 0.0:
x = int(M['m10'] / M['m00'])
y = int(M['m01'] / M['m00'])

8. Klasifikasikan bentuk yang terdeteksi berdasarkan jumlah titik kontur yang ditemukan dan
9. Berikan label pada bentuk geometri yang telah ditemukan klasifikasinya

Dua langkah selanjutnya adalah mengklasifikasikan bentuk yang terdeteksi berdasarkan jumlah titik kontur dan memberikan label pada bentuk geometri tersebut. Untuk melakukannya, dapat menggunakan blok kode berikut ini.

    if len(approx) == 3:
        cv2.putText(img, 'Triangle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

    elif len(approx) == 4:
        cv2.putText(img, 'Rectangular', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

    elif len(approx) == 5:
        cv2.putText(img, 'Pentagon', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

    elif len(approx) == 6:
        cv2.putText(img, 'Hexagon', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

    else:
        cv2.putText(img, 'circle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

10. Tampilkan keluaran

Tahapan terakhir adalah menampilkan hasil keluarannya. Untuk itu, kita akan menggunakan fungsi imshow untuk menampilkan hasil keluarannya. Berikut adalah blok kodenya.

cv2.imshow('shapes', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

Mari kita bahas satu per satu mulai dari memasukkan gambar hingga program dapat merekognisi object geometri dua dimensi yang ada di dalamnya.

1. Input gambar

Ketika kita melakukan input gambar, maka tidak ada proses berarti yang terjadi. Gambar yang dijadikan input akan diload oleh openCV dan disimpan dalam sebuah variabel. Jika variabel ini ditampilkan maka juga akan menampilkan gambar yang kita jadikan rujukan/input.

Gambar original

2. Mengubah gambar Ke dalam mode grayscale

Tahapan selanjutnya adalah mengubah gambar ke dalam mode grayscale sehingga pencarian kontur dapat lebih mudah. Pada tahapan ini, seperti yang sudah bisa ditebak, gambar akan menjadi grayscale.

Gambar yang telah diubah menjadi mode grayscale

3. Mencari kontur dari object dan menggambar garis penegas kontur

Di langkah ini, sebuah proses iterasi dilakukan untuk menemukan dari gambar yang sudah dalam mode grayscale tadi. Setelah kontur dari sebuah object ditemukan, maka sebuah garis penegas akan digambarkan pada gambar original. Sehingga keluarannya akan menjadi seperti berikut ini.

Gambar original dengan garis tambahan kontur berwarna merah

4. Menuliskan label pada object

Di langkah terakhir ini tidak ada hal khusus yang terjadi. Karena di langkah terakhir ini, proses pencarian kontur sudah selesai begitu proses klasifikasinya. Sehingga di tahap ini hanya menambahkan teks ke dalam object sebagai label klasifikasi.

Keluaran akhir dengan label klasifikasi bentuk object

Bagaimana, mudah bukan? Jika masih bingung berikut adalah kodingan lengkap dari program pada postingan kali.

import cv2

img = cv2.imread('shape_testing.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

i = 0

for contour in contours:

    if i == 0:
        i = 1
        continue

    approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)

    cv2.drawContours(img, [contour], 0, (0, 0, 255), 5)

    M = cv2.moments(contour)
    if M['m00'] != 0.0:
        x = int(M['m10'] / M['m00'])
        y = int(M['m01'] / M['m00'])

    if len(approx) == 3:
        cv2.putText(img, 'Triangle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

    elif len(approx) == 4:
        cv2.putText(img, 'Rectangular', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

    elif len(approx) == 5:
        cv2.putText(img, 'Pentagon', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

    elif len(approx) == 6:
        cv2.putText(img, 'Hexagon', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

    else:
        cv2.putText(img, 'circle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)

cv2.imshow('shapes', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

Sedangkan berikut ini adalah struktur file dalam project Merekognisi Bentuk Objek Geometri Dua Dimensi dengan Menggunakan OpenCV.

Berikut adalah gambar yang digunakan dalam project ini. Untuk mengunduhnya, klik kanan pada gambar dan pilih simpan gambar sebagai…


Demikian postingan Merekognisi Bentuk Objek Geometri Dua Dimensi dengan Menggunakan OpenCV kali ini. Semoga bermanfaat. Apabila ada pertanyaan mengenai project ini, Anda dapat meninggalkannya di kolom komentar. Dan, Apabila Anda menemukan artikel ini berguna, Anda dapat membagikannya. Anda juga dapat mencuplik beberapa bagian dari artikel ini, namun jangan lupa untuk sertakan URL nya. Terima kasih.

^_^

Advertisements

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *