Menggunakan ArUco untuk Marker pada Computer Vision

By | July 14, 2024
236 Views

ArUco adalah sebuah pustaka open-source yang digunakan untuk mendeteksi dan mengenali marker atau penanda dalam gambar. Marker ini biasanya berupa kode biner yang tertera pada kotak hitam putih. ArUco marker sering digunakan dalam berbagai aplikasi, seperti augmented reality (AR), robotika, dan visi komputer.

ArUco marker adalah singkatan dari “Augmented Reality University of Cordoba” marker. Ini adalah teknologi yang dikembangkan oleh Universitas Cordoba di Spanyol untuk pelacakan visual dalam aplikasi augmented reality. ArUco marker adalah pola persegi yang digunakan dalam visi komputer untuk mendeteksi dan menentukan pose objek di ruang 3D.

ArUco pertama kali dikembangkan oleh Rafael Muñoz Salinas, seorang profesor di Departemen Informatika dan Teknik di Universitas Córdoba, Spanyol. Proyek ini dimulai sebagai bagian dari penelitian dalam bidang visi komputer dan pengolahan citra. Rafael Muñoz Salinas bersama dengan tim penelitinya menciptakan ArUco untuk menyediakan alat yang efisien dan mudah digunakan dalam mendeteksi dan mengenali marker.

ArUco telah berkembang dan digunakan secara luas dalam berbagai aplikasi industri, akademis, dan penelitian karena kemampuannya yang handal dalam deteksi marker dan estimasi pose. Pustaka ini menjadi salah satu pilihan populer bagi pengembang yang bekerja dengan augmented reality, robotika, dan berbagai aplikasi visi komputer lainnya.

Cara Kerja ArUco

ArUco bekerja dengan mendeteksi dan mengenali pola khusus pada marker. Berikut adalah langkah-langkah umum bagaimana ArUco bekerja:

  1. Pembuatan Marker:
    • Marker ArUco dibuat dalam bentuk gambar kotak hitam putih dengan kode biner di dalamnya. Setiap marker memiliki ID unik yang direpresentasikan oleh pola biner tersebut.
  2. Deteksi Marker:
    • Gambar atau video yang mengandung marker ArUco diambil menggunakan kamera. Pustaka ArUco kemudian memproses gambar ini untuk mencari pola marker.
    • Pustaka ArUco menggunakan algoritma deteksi tepi dan pengenalan kontur untuk menemukan kotak hitam putih dalam gambar.
  3. Ekstraksi dan Dekoding:
    • Setelah kotak marker ditemukan, algoritma ArUco akan mengekstrak area di dalam kotak tersebut.
    • Pola biner di dalam kotak tersebut kemudian didekode untuk menentukan ID marker.
  4. Estimasi Pose:
    • Berdasarkan posisi marker dalam gambar, algoritma ArUco dapat mengestimasi pose (posisi dan orientasi) marker dalam ruang 3D.
    • Informasi ini sangat berguna dalam aplikasi AR dan robotika, di mana posisi dan orientasi objek perlu diketahui secara tepat.

Kelebihan ArUco

  • Kecepatan dan Akurasi: ArUco dikenal memiliki kecepatan dan akurasi yang baik dalam mendeteksi marker, bahkan dalam kondisi pencahayaan yang buruk atau gambar yang mengalami distorsi perspektif.
  • Kemudahan Implementasi: Pustaka ArUco mudah diimplementasikan dan terintegrasi dengan pustaka visi komputer populer seperti OpenCV.
  • Fleksibilitas: Marker ArUco dapat digunakan dalam berbagai ukuran dan resolusi, membuatnya cocok untuk berbagai aplikasi.

Aplikasi ArUco

  1. Augmented Reality: ArUco digunakan untuk menambahkan elemen virtual ke dalam dunia nyata dengan tepat, memungkinkan aplikasi AR yang interaktif dan realistis.
  2. Robotika: ArUco membantu robot dalam navigasi dan penentuan posisi dengan mengenali marker yang ditempatkan di lingkungan.
  3. Pengukuran dan Kalibrasi: Marker ArUco digunakan untuk pengukuran dan kalibrasi sistem kamera, membantu meningkatkan akurasi pengukuran dalam aplikasi industri dan penelitian.

ArUco seperti QR barcode namun lebih simple. Kalian bisa membuat ArUco melalui https://chev.me/arucogen/.  Berikut ArUco dimulai dari 1 sampai 4.

Mari kita coba gunakan aruco dikertas dan difoto secara deskewing menggunakan Ponsel

Berikut hasil deteksi ArUco

hasil deteksi ArUco

hasil deteksi ArUco

hasil deteksi ArUco

Pada contoh diatas, kita menggunakan ArUco cv2.aruco.DICT_4X4_50

 

import cv2 
import numpy as np
 
# load gambar 
frame = cv2.imread('/Users/user/Desktop/coba aruco.jpg',1)

# Jenis ArUco yang bisa kalian gunakan
ARUCO_DICT = {
  "DICT_4X4_50": cv2.aruco.DICT_4X4_50,
  "DICT_4X4_100": cv2.aruco.DICT_4X4_100,
  "DICT_4X4_250": cv2.aruco.DICT_4X4_250,
  "DICT_4X4_1000": cv2.aruco.DICT_4X4_1000,
  "DICT_ARUCO_ORIGINAL": cv2.aruco.DICT_ARUCO_ORIGINAL
}
  

dictionary = cv2.aruco.getPredefinedDictionary(ARUCO_DICT['DICT_4X4_50'])
parameters = cv2.aruco.DetectorParameters()

detector = cv2.aruco.ArucoDetector(dictionary, parameters)



corners, ids, rejectedCandidates = detector.detectMarkers(frame)

     
       
# Check that at least one ArUco marker was detected
if len(corners) > 0:
  # Flatten the ArUco IDs list
  ids = ids.flatten()
   
  # Loop over the detected ArUco corners
  for (marker_corner, marker_id) in zip(corners, ids):
   
    # Extract the marker corners
    corners = marker_corner.reshape((4, 2))
    (top_left, top_right, bottom_right, bottom_left) = corners
     
    # Convert the (x,y) coordinate pairs to integers
    top_right = (int(top_right[0]), int(top_right[1]))
    bottom_right = (int(bottom_right[0]), int(bottom_right[1]))
    bottom_left = (int(bottom_left[0]), int(bottom_left[1]))
    top_left = (int(top_left[0]), int(top_left[1]))
     
    # Draw the bounding box of the ArUco detection
    cv2.line(frame, top_left, top_right, (0, 255, 0), 2)
    cv2.line(frame, top_right, bottom_right, (0, 255, 0), 2)
    cv2.line(frame, bottom_right, bottom_left, (0, 255, 0), 2)
    cv2.line(frame, bottom_left, top_left, (0, 255, 0), 2)
     
    # Calculate and draw the center of the ArUco marker
    center_x = int((top_left[0] + bottom_right[0]) / 2.0)
    center_y = int((top_left[1] + bottom_right[1]) / 2.0)
    cv2.circle(frame, (center_x, center_y), 4, (0, 0, 255), -1)
     
    # Draw the ArUco marker ID on the video frame
    # The ID is always located at the top_left of the ArUco marker
    cv2.putText(frame, 
                str(marker_id),
                (top_left[0], top_left[1] - 15),
                cv2.FONT_HERSHEY_SIMPLEX,
                2, 
                (0, 255, 0), 2)
  
from matplotlib import pyplot as plt

plt.figure()
plt.imshow(frame)
plt.show()

Atau paling cepat menggunakan kode berikut

import cv2
import cv2.aruco as aruco

# Membaca gambar
image = cv2.imread('path_to_image.jpg')

# Mengkonversi gambar ke skala abu-abu
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Memuat kamus marker ArUco
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)

# Parameter deteksi
parameters = aruco.DetectorParameters_create()

# Deteksi marker
corners, ids, rejected = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)

# Menggambar kotak di sekitar marker yang terdeteksi
image_with_markers = aruco.drawDetectedMarkers(image.copy(), corners, ids)

# Menampilkan gambar hasil deteksi
cv2.imshow('Detected Markers', image_with_markers)
cv2.waitKey(0)
cv2.destroyAllWindows()

Gimana menurut kalian? Menggunakan ArUco untuk Marker pada Computer Vision