Menggambar Objek dengan OpenCV Menggunakan Go (Golang) GoCV

Cecep Aprilianto
5 min readNov 17, 2022

--

Postingan blog ini akan menunjukan cara menggambar objek garis, persegi, lingkaran, dan elips dengan OpenCV menggunakan bahasa pemrograman Go (Golang) dan package GoCV.

OpenCV adalah library fungsi pemrograman yang utamanya ditujukan untuk real-time computer vision. Awalnya dikembangkan oleh Intel, kemudian didukung oleh Willow Garage lalu Itseez. Library ini cross platform dan gratis untuk digunakan di bawah Lisensi open-source Apache 2 License.

Selain untuk menggambar objek, OpenCV juga bisa digunakan untuk face detection, motion tracking dan lain sebagainya.

GoCV adalah package untuk bahasa Golang yang mendukung rilis terbaru Go dan OpenCV v4.5.4 di Linux, macOS, dan Windows. GoCV menjadikan bahasa Go sebagai client “first-class” yang kompatibel dengan perkembangan terbaru dalam ekosistem OpenCV.

GoCV memberikan programmer golang akses ke library computer vision OpenCV 4.

Persyaratan yang dibutuhkan

  1. Menginstall Golang (Pastikan target OS nya sesuai dengan komputer Anda)
  2. Menginstall OpenCV

Install OpenCV

Untuk panduan install OpenCV, Anda dapat membuka dokumentasi pada website GoCV di https://gocv.io

  1. Install di MacOs
  2. Install di Linux
  3. Install di Windows

Atau bisa mengunjungi website resminya disini. Saya sendiri menggunakan Sistem Operasi MacOs.

Membuat proyek

Pertama kita buat dulu proyek baru dengan perintah berikut:

mkdir belajar-gocv
cd belajar-gocv

Lalu buat module dengan perintah berikut:

go mod init belajar-gocv

Buka proyeknya dengan IDE atau Editor lain, misalnya VSCode. Buat file di root dengan nama main.go, lalu selanjutnya kita akan membuat fungsi untuk menggambar objek.

package main

func main() {
// buat canvas
}

Install Library

Instal package GoCV

go get -u -d gocv.io/x/gocv

Menggambar Objek dengan OpenCV

Penggunaan OpenCV selain untuk memperbaiki kualitas citra sebuah image atau video, dapat juga digunakan untuk menggambar dan menulis sebuah objek.

Membuat Canvas

Buka main.go lalu ubah/tambahkan kode berikut pada fungsi main:

package main

import "gocv.io/x/gocv"

func main() {
// membuat window baru
window := gocv.NewWindow("Belajar Gambar Objek")
defer window.Close()

// membuat canvas
width := 640
height := 480
canvas := gocv.NewMatWithSize(width, height, gocv.MatTypeCV8UC3)

// loop
for {
// tampilkan canvas di window
window.IMShow(canvas)

// wait key to press
if window.WaitKey(10) >= 0 {
break
}
}
}

Coba jalankan kode diatas dengan perintah berikut:

go run main.go

Maka akan muncul window kosong berwarna hitam

Window Baru

Tekan esc pada keyboard untuk menutup window.

Membuat Warna

Pertama kita siapkan warna yang akan digunakan pada objek. Buka main.go tambahkan baris berikut setelah membuat canvas

// membuat canvas
...

// membuat warna
red := color.RGBA{255, 0, 0, 0}
green := color.RGBA{0, 255, 0, 0}
blue := color.RGBA{0, 0, 255, 0}
purple := color.RGBA{106, 90, 205, 0}

// loop
...

Membuat Garis

Setelah berhasil membuat canvas, selanjutnya kita coba gambar canvas tersebut dengan garis (line). Sebelum menggambar garis, kita harus memahami fungsi dan atribut yang dipakai untuk mengambar garis tersebut. Struktur fungsi dan atribut yang digunakan untuk menggambar garis adalah sebagai berikut :

gocv.Line(img *gocv.Mat, pt1 image.Point, pt2 image.Point, c color.RGBA, thickness int)
  • img = digunakan untuk menentukan dimana garis akan digambar menggunakan referensi alamat memorinya
  • pt1 = (x1, y1) koordinat awal untuk membuat titik pertama garis
  • pt2 = (x2, y2) koordinat akhir untuk membuat titik akhir garis
  • c = (color) nilai antara 0–255 untuk membuat warna RGBA
  • thickness = ketebalan garis

Buka main.go dan tambahkan baris berikut:

// membuat canvas
...

// membuat warna
...

// membuat garis
gocv.Line(&canvas, image.Pt(100, 150), image.Pt(300, 400), red, 1)

// loop
...

coba jalankan kode diatas dengan perintah berikut:

go run main.go

Maka hasilnya akan seperti berikut:

Membuat Garis

Membuat Persegi

Objek kedua yang akan dibuat adalah persegi empat.

gocv.Rectangle(img *gocv.Mat, r image.Rectangle, c color.RGBA, thickness int)
  • img = digunakan untuk menentukan dimana persegi akan digambar menggunakan referensi alamat memorinya
  • r = (x0, y0, x1, y1) x0 dan y0 adalah koordinat sudut kiri atas persegi, x1 dan y1 adalah koordinat sudut kanan bawah persegi
  • c = (color) nilai antara 0–255 untuk membuat warna RGBA
  • thickness = ketebalan garis

Buka main.go dan tambahkan baris berikut:

// membuat canvas
...
// membuat warna
...
// membuat garis
...
// membuat persegi
gocv.Rectangle(&canvas, image.Rect(150, 200, 350, 400), green, 2)
// loop
...

coba jalankan kode diatas dengan perintah berikut:

go run main.go

Maka hasilnya akan seperti berikut:

Membuat Persegi

Membuat Lingkaran

Lingkaran adalah objek yang garis contour-nya menutup sempurna.

gocv.Circle(img *gocv.Mat, center image.Point, radius int, c color.RGBA, thickness int)
  • img = digunakan untuk menentukan dimana lingkaran akan digambar menggunakan referensi alamat memorinya
  • center = (x, y) Menunjukan titik tengah lingkaran pada sumbu x dan y
  • radius = Menunjukan radius (luas) lingkaran
  • c = (color) nilai antara 0–255 untuk membuat warna RGBA
  • thickness = ketebalan garis (-1 untuk mengisi semua ruang)

Buka main.go dan tambahkan baris berikut:

// membuat canvas
...
// membuat warna
...
// membuat garis
...
// membuat persegi
...
// membuat lingkaran
gocv.Circle(&canvas, image.Pt(220, 250), 80, blue, -1)
// loop
...

coba jalankan kode diatas dengan perintah berikut:

go run main.go

Maka hasilnya akan seperti berikut:

Membuat Ligkaran

Membuat Elips

Elips adalah objek yang garis contour-nya TIDAK menutup sempurna, kebalikan dari lingkaran.

gocv.Ellipse(img *gocv.Mat, center image.Point, axes image.Point, angle float64, startAngle float64, endAngle float64, c color.RGBA, thickness int)
  • img =
  • center = (x, y) koordinat titik tengah elips
  • axes = (minorAxes, majorAxes) = panjang sumbu kecil dan besar
  • angel = rotation, sudut perputaran elips dihitung berlawanan arah jarum jam
  • startAngle = sudut awal (dihitung searah jarum jam)
  • endAngel = sudut akhir (dihitung searah jarum jam)
  • c = (color) nilai antara 0–255 untuk membuat warna RGBA
  • thickness = ketebalan garis

Buka main.go dan tambahkan baris berikut:

// membuat canvas
...
// membuat warna
...
// membuat garis
...
// membuat persegi
...
// membuat lingkaran
...
// membuat ellips
gocv.Ellipse(&canvas, image.Pt(300, 500), image.Pt(100, 50), 45, 130, 270, purple, 4)
// loop
...

coba jalankan kode diatas dengan perintah berikut:

go run main.go

Maka hasilnya akan seperti berikut:

Membuat Elips

Mungkin postingan selanjutnya kita akan mencoba face detection, dimana kita akan menggambar persegi disekitar objek yang dideteksi sebagai wajah.

Terimakasih…

Source Code

--

--