Pelacakan Objek Berbasis Visi Otomatis dengan Raspberry Pi dan OpenCV
Sistem servo pan/tilt yang secara otomatis melacak objek berwarna menggunakan komputer visi.
Cerita
Pendahuluan
Dalam tutorial sebelumnya kita mempelajari cara mengontrol servo pan/tilt untuk memosisikan kamera Raspberry Pi. Hari ini kita akan memperluas setup tersebut sehingga kamera dapat secara otonom melacak objek berwarna.
Ini adalah pengalaman praktik pertama saya dengan OpenCV, dan saya sudah terpesona dengan pustaka komputer visi open-source ini.
OpenCV gratis untuk penggunaan akademis dan komersial, menawarkan antarmuka C++, C, Python, dan Java, dan berjalan di Windows, Linux, macOS, iOS, dan Android. Dalam seri ini kita akan fokus pada Raspberry Pi (Raspbian) dan Python, karena OpenCV dibangun untuk efisiensi komputasi dan aplikasi real-time—tepat yang Anda butuhkan untuk proyek komputasi fisik.
Langkah 1: BOM – Bill of Materials
Bagian utama:
- Raspberry Pi V3 – US$ 32,00
- Modul Kamera Video Mini OV5647 5 MP 1080p – US$ 13,00
- Servo Mikro TowerPro SG90 9G 180-derajat (2 ×) – US$ 4,00
- Platform Kamera Pan/Tilt Mini Anti-Getaran dengan 2 Servo (*) – US$ 8,00
- LED Merah
- Resistor 220 Ω
- Resistor 1 kΩ (2 ×) – Opsional
- Berbagai: bagian logam, pita, dll. (jika Anda membuat mekanisme pan/tilt sendiri)
(*) Anda dapat membeli platform pan/tilt lengkap dengan servo atau membangun sendiri.
Langkah 2: Menginstal Paket OpenCV 3
Pada Raspberry Pi V3 yang menjalankan Raspbian Stretch terbaru, metode paling andal adalah mengikuti tutorial Adrian Rosebrock (Raspbian Stretch: Install OpenCV 3 + Python di Raspberry Pi Anda). Ini memandu Anda melalui membangun OpenCV dari sumber dan menyiapkan lingkungan virtual Python khusus.
Setelah menyelesaikan tutorial, aktifkan lingkungan virtual dan konfirmasi instalasi:
source ~/.profile workon cv python import cv2 print(cv2.__version__)
Anda seharusnya melihat versi 3.3.0 atau lebih baru. Output mengonfirmasi bahwa OpenCV siap digunakan di dalam lingkungan virtual cv.
Langkah 3: Menguji Kamera Anda
Dengan OpenCV terinstal, verifikasi bahwa PiCamera streaming dengan benar. Jalankan skrip berikut (atau unduh simpleCamTest.py):
import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() frame = cv2.flip(frame, -1) # Flip vertikal jika diperlukan gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('frame', frame) cv2.imshow('gray', gray) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
Tekan q atau Ctrl+C untuk keluar. Jalankan yang berhasil menampilkan umpan warna dan grayscale.
Langkah 4: Deteksi Warna dengan OpenCV
OpenCV bekerja di ruang warna HSV (Hue, Saturation, Value), yang lebih sesuai dengan persepsi warna manusia. Untuk mendeteksi warna tertentu, Anda pertama-tama menentukan nilai BGR-nya, lalu mengonversi ke HSV dan menetapkan batas bawah/atas.
Contoh: Melacak objek kuning. Menggunakan pemilih warna (misalnya, PowerPoint), Anda menemukan nilai BGR (71, 234, 213). Konversikan ke HSV dengan skrip berikut (atau unduh bgr_hsv_converter.py):
import sys, numpy as np, cv2 blue, green, red = int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]) color = np.uint8([[[blue, green, red]]]) hsv = cv2.cvtColor(color, cv2.COLOR_BGR2HSV) hue = hsv[0][0][0] print('Batas bawah:', [hue-10, 100, 100]) print('Batas atas:', [hue+10, 255, 255])
Menjalankan python bgr_hsv_converter.py 71 234 213 mencetak:
Batas bawah: [24, 100, 100] Batas atas: [44, 255, 255]
Gunakan batas ini untuk memutari warna dalam gambar:
import cv2, numpy as np img = cv2.imread('yellow_object.JPG', 1) img = cv2.resize(img, (0,0), fx=0.2, fy=0.2) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) lower = np.array([24, 100, 100], dtype=np.uint8) upper = np.array([44, 255, 255], dtype=np.uint8) mask = cv2.inRange(hsv, lower, upper) cv2.imshow('mask', mask) cv2.imshow('image', img) while True: k = cv2.waitKey(0) if k == 27: break cv2.destroyAllWindows()
Simpan skrip sebagai colorDetection.py dan jalankan python colorDetection.py (pastikan gambar ada di direktori yang sama).
Langkah 5: Pelacakan Objek Real-Time
Berdasarkan mask, kita dapat melacak sentroid objek frame demi frame. Kode di bawah ini meminjam dari tutorial Pelacakan Bola Adrian Rosebrock dan menggabungkan batas HSV yang kita tentukan sebelumnya.
Pertama, pastikan library imutils terinstal:
pip install imutils
Lalu jalankan ball_tracking.py:
python ball_tracking.py
Skrip membalik frame secara vertikal (jika diperlukan) dan menerapkan mask. Saat objek terdeteksi, lingkaran dan sentroid digambar.
Langkah 6: Menguji GPIO
Sekarang mari tambahkan LED merah ke Pi dan konfirmasi bahwa kita dapat mengontrolnya melalui GPIO.
Penghubungan: Hubungkan katoda LED ke GPIO 21, anoda ke ground melalui resistor 220 Ω.
Jika RPi.GPIO belum terinstal di lingkungan cv, instal:
pip install RPi.GPIO
Skrip uji (LED_simple_test.py):
import sys, time, RPi.GPIO as GPIO led = int(sys.argv[1]) freq = int(sys.argv[2]) GPIO.setmode(GPIO.BCM) GPIO.setup(led, GPIO.OUT) GPIO.setwarnings(False) print(f'Memblinkakan LED pada GPIO {led} setiap {freq}s, 5 kali.') for _ in range(5): GPIO.output(led, GPIO.LOW) time.sleep(freq) GPIO.output(led, GPIO.HIGH) time.sleep(freq) GPIO.cleanup()
Jalankan dengan python LED_simple_test.py 21 1 untuk memblinkakan LED lima kali setiap detik.
Langkah 7: Pengenalan Warna & Interaksi GPIO
Gabungkan logika pelacakan dengan kontrol GPIO sehingga LED menyala setiap kali warna target terdeteksi. Tambahan inti adalah:
import RPi.GPIO as GPIO led = 21 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(led, GPIO.OUT) GPIO.output(led, GPIO.LOW) ledOn = False
Di dalam loop deteksi, setelah mengonfirmasi radius yang valid, tambahkan:
if not ledOn: GPIO.output(led, GPIO.HIGH) ledOn = True
Skrip lengkap: object_detection_LED.py. Jalankan dengan python object_detection_LED.py. LED menyala hanya saat warna objek berada dalam batas HSV.
Langkah 8: Mekanisme Pan/Tilt
Dengan OpenCV dan GPIO bekerja, pasang servo pada supply daya 5 V eksternal. Hubungkan pin data sebagai berikut:
- GPIO 17 → Servo Tilt
- GPIO 27 → Servo Pan
Bagikan ground antara Pi, servo, dan supply daya. Opsional tempatkan resistor 1 kΩ dalam seri antara pin GPIO Pi dan pin data servo untuk melindungi Pi dari lonjakan arus.
Uji kontrol servo dengan angleServoCtrl.py:
from time import sleep import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) def setServoAngle(servo, angle): pwm = GPIO.PWM(servo, 50) pwm.start(8) duty = angle / 18. + 3. pwm.ChangeDutyCycle(duty) sleep(0.3) pwm.stop() if __name__ == '__main__': import sys servo = int(sys.argv[1]) GPIO.setup(servo, GPIO.OUT) setServoAngle(servo, int(sys.argv[2])) GPIO.cleanup()
Contoh: python angleServoCtrl.py 17 45 menggerakkan servo tilt ke 45°.
Langkah 9: Menentukan Posisi Objek Real-Time
Untuk memusatkan kamera pada target, kita pertama-tama membutuhkan koordinat sentroid objek. Modifikasi objectDetect_LED.py untuk mencetak nilai x dan y:
def mapObjectPosition(x, y): print(f'[INFO] Posisi sentroid objek di X={x}, Y={y}')
Koordinat berkisar dari 0–500 (kiri-ke-kanan) untuk x dan 0–350 (atas-ke-bawah) untuk y. Pindahkan objek dan amati output langsung.
Langkah 10: Sistem Pelacakan Posisi Objek
Definisikan region “terpusat” (misalnya, 220 < x < 280 dan 160 < y < 210). Jika objek jatuh di luar, sesuaikan servo pan dan tilt sesuai dengan itu:
def mapServoPosition(x, y): global panAngle, tiltAngle if x < 220: panAngle = min(panAngle + 10, 140) positionServo(panServo, panAngle) if x > 280: panAngle = max(panAngle - 10, 40) positionServo(panServo, panAngle) if y < 160: tiltAngle = min(tiltAngle + 10, 140) positionServo(tiltServo, tiltAngle) if y > 210: tiltAngle = max(tiltAngle - 10, 40) positionServo(tiltServo, tiltAngle)
Helper positionServo(servo, angle) cukup memanggil angleServoCtrl.py:
import os def positionServo(servo, angle): os.system(f'python angleServoCtrl.py {servo} {angle}') print(f'[INFO] Memosisikan servo GPIO {servo} ke {angle}°')
Semua skrip ada di direktori yang sama; unduh implementasi lengkap dari objectDetectTrack.py.
Kesimpulan
Proyek ini menunjukkan cara menggabungkan OpenCV, GPIO Raspberry Pi, dan montir servo pan-tilt untuk membuat sistem pelacakan objek berwarna otonom. Silakan bereksperimen dengan warna, bentuk, dan kecepatan servo yang berbeda.
Kode lengkap dan sumber daya tambahan tersedia di GitHub dan blog MJRoBot.org.
Terima kasih telah membaca—sampai jumpa di tutorial berikutnya!