Menggambar Objek dengan OpenCV Menggunakan Go (Golang) GoCV
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
- Menginstall Golang (Pastikan target OS nya sesuai dengan komputer Anda)
- Menginstall OpenCV
Install OpenCV
Untuk panduan install OpenCV, Anda dapat membuka dokumentasi pada website GoCV di https://gocv.io
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
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 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 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 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:
Mungkin postingan selanjutnya kita akan mencoba face detection, dimana kita akan menggambar persegi disekitar objek yang dideteksi sebagai wajah.
Terimakasih…