Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

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:

(*) 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:

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!

Proses manufaktur

  1. Menguasai Pemrograman Berorientasi Objek Python: Kelas, Warisan, Enkapsulasi & Polimorfisme
  2. Pelacakan Bola Tenis Meja Tingkat Lanjut dengan Raspberry Pi dan OpenCV
  3. Speathe: Komunikasi Berbasis Napas untuk Pengguna Paralisis
  4. Pengenalan Wajah Real-Time pada Raspberry Pi – Panduan Ujung ke Ujung
  5. Pemrograman Berorientasi Objek Python: Panduan Lengkap
  6. Mengukur Akurasi Pelacakan Objek Dinamis dalam Sistem Motion Capture
  7. Filter Baru Meningkatkan Penglihatan Robot untuk Estimasi Posisi 6-D Akurat
  8. Memahami Mesin Tekan Otomatis: Fungsi, Manfaat, dan Aplikasi
  9. Memahami Tekan Otomatis: Fitur, Manfaat, dan Aplikasi
  10. Memahami Pemipa Otomatis: Fungsi, Manfaat, dan Aplikasi