Augmented Reality with OpenCV

Didi Ruhyadi
4 min readFeb 27, 2022

Simple 2D Augmented Reality with OpenCV

Introduction

Apa itu Augmented Reality (AR)?. Secara sederhana dapat diartikan sebagai pengalaman pengguna (user) pada suatu objek yang ditingkatkan (augmented) oleh komputer. Jadi intinya terdapat pengguna (user) dan terdapat objek yang di-augmented oleh komputer.

Simple AR with OpenCV

Tujuan dari pages kali ini adalah untuk mendemonstrasikan pembuatan AR sederhana menggunakan pustaka OpenCV. Repository source code dapat akses pada ruhyadi/Augmented-Reality. Untuk mempermudah pemahaman disediakan juga versi Jupyter Notebook. Langkah pembuatan sebagai berikut:

1. Feature Detection

Feature detection merupakan metode untuk mendeteksi fitur/landmark/pola penting pada suatu citra/gambar. Fitur yang dimaksud dalam hal ini adalah pola pembeda yang dapat membedakan gambar satu dengan lainnya.

Terdapat berbagai macam fitur detection yang tersedia pada pustaka OpenCV, seperti:

- Scale Invariant Feature Transform (SIFT)

- Speeded-Up Robust Features (SURF)

- Features from Accelerated Segment Test (FAST)

- Binary Robust Independent Elementary Features (BRIEF)

- Oriented FAST and Rotated BRIEF (ORB)

Dalam implementasi kali ini kita akan menggunakan ORB Feature Detection yang tersedia pada fungsi cv2.ORB_create() di OpenCV.

Fungsi ORB Feature Detection adalah untuk mendeteksi fitur yang sama antara gambar acuan dengan frame. Gambar acuan atau model (pattern) merupakan gambar yang dijadikan acuan dalam drawing augmented reality nantinya. Gambar ini sebisa mungkin bersifat unik dan berbeda dengan lingkungan sekitar. Penulis menggunakan pola ArUco sebagai gambar acuan, walaupun metode yang digunakan adalah markerless. Pola ini mudah dibedakan dengan lingkungan sekitar sehingga mudah dideteksi.

Deteksi fitur pada gambar acuan dan frame dapat dengan mudah dilakukan menggunakan fungsi detectAndCompute() dari fungsi ORB yang telah dibuat sebelumnya. Dengan menerapkan fungsi tersebut pada gambar acuan dan frame, kita mendapatkan fitur-fitur yang terdeteksi pada masing-masing gambar.

2. Feature Matching

Fungsi detectAndCompute() menghasilkan keypoint dan descriptor dari masing-masing gambar, tetapi tidak mengetahui apakah ada kesamaan deskripsi dari kedua gambar tersebut. Oleh karena itu dibutuhkan metode feature matching untuk mengetahui kesamaan kedua gambar.

OpenCV menyediakan fungsi untuk menghitung kesamaan fitur, salah satunya menggunakan fungsi BFMatcher(). Fungsi ini membutuhkan input berupa descriptor dari masing-masing gambar, kemudian akan dihasilkan daftar descriptor yang mempunyai kesamaan. Kesamaan atau matching tersebut dapat kita plot menggunakan fungsi cv2.drawMatcher yang akan menghasilkan hubungan kesamaan antar keypoint dari kedua gambar. Pada gambar dibawah terdapat 209 matching keypoint.

3. Homography Computation

Homo what? Homography secara sederhana merupakan matrix transformasi yang digunakan untuk mentransformasikan point dari satu perspektif ke perspektif lainnya (perspektif = pandangan). Hal ini penting untuk mendapatkan empat buah titik pembatas (four corner) dari pola yang dideteksi, sehingga augmentasi objek tidak keluar dari pembatas tersebut.

Terdapat dua matrix transformasi yang digunakan, matrix pertama merupakan matriks homography yang digunakan untuk tujuan mencari empat buah titik pembatas. Sedangkan, matriks kedua merupakan matrix perspektif (I don’t have another name, LOL) yang digunakan untuk mentransformasikan gambar overlay (gambar yang diaugmentasi) menuju frame.

Matriks homography dapat dihitung menggunakan fungsi cv2.findHomography() yang mempunyai dua inputan berupa keypoint dari kedua gambar dan metode stiching yang digunakan (dalam ini menggunakan RANSAC). Untuk dapat menentukan koordinat four corner pada frame, kita mentransformasikan four corner dari gambar acuan menggunakan matriks homography dengan fungsi cv2.perspectiveTransform().

Matriks perpektif selanjutnya dapat dihitung menggunakan fungsi cv2.getPerspectiveTransform() dengan inputan four corner dari frame yang telah didapat dan four corner dari gambar overlay. Matriks perspektif ini selanjutnya digunakan untuk mentransformasikan gambar overlay menuju frame menggunakan fungsi cv2.warpPerspective().

4. Masking

Langkah terakhir yang tidak kalah penting adalah masking image. Pada langkah ini adalah untuk menempelkan gambar overlay pada frame. Untuk melakukan hal tersebut diperlukan layer masking terlebih dahulu. Layer masking dapat dibuat menggunakan fungsi cv2.bitwise_and yang membutuhkan inputan berupa frame dan mask. Selanjutnya layer masking dapat ditambahkan pada gambar overlay yang telah ditransformasikan sebelumnya menggunakan fungsi cv2.add(). Hasilnya sebagai berikut.

That’s all. Untuk mempermudah pemahaman silahkan akses versi Jupyter Notebook. Artikel ini juga tersedia dalam Github Pages ruhyadi.github.io.

--

--

Didi Ruhyadi

Want to be writter (Really), but i don't know how.