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

Pelacakan Objek Penglihatan Otomatis

Perangkat servo pan/tilt yang membantu kamera untuk melacak objek berwarna secara otomatis menggunakan penglihatan.

Cerita

Pendahuluan

Pada tutorial terakhir saya, kami menjelajahi cara mengontrol perangkat Servo Pan/Tilt untuk memposisikan PiCam. Sekarang kita akan menggunakan perangkat kita untuk membantu kamera melacak objek berwarna secara otomatis

Ini adalah pengalaman pertama saya dengan OpenCV dan harus saya akui, saya jatuh cinta dengan "Perpustakaan Visi Komputer Open Source" yang fantastis ini.

OpenCV gratis untuk penggunaan akademis dan komersial. Ini memiliki antarmuka C++, C, Python dan Java dan mendukung Windows, Linux, Mac OS, iOS dan, Android. Pada seri tutorial OpenCV saya, kami akan fokus pada Raspberry Pi (jadi, Raspbian sebagai OS) dan Python. OpenCV dirancang untuk efisiensi komputasi dan dengan fokus yang kuat pada aplikasi waktu nyata. Jadi, ini sempurna untuk proyek komputasi Fisik!

Langkah 1:BOM – Bill of Material

Bagian utama:

(*) Anda dapat membeli platform Pan/Tilt lengkap dengan servos atau membuatnya sendiri.

Langkah 2:Menginstal Paket OpenCV 3

Saya menggunakan Raspberry Pi V3 yang diperbarui ke versi terakhir Raspbian (Stretch), jadi cara terbaik untuk menginstal OpenCV adalah dengan mengikuti tutorial luar biasa yang dikembangkan oleh Adrian Rosebrock: Raspbian Stretch:Install OpenCV 3 + Python di Raspberry Pi Anda.

Saya mencoba beberapa panduan berbeda untuk menginstal OpenCV di Pi saya. Tutorial Adrian adalah yang terbaik. Saya menyarankan Anda untuk melakukan hal yang sama, mengikuti panduannya selangkah demi selangkah.

Setelah Anda menyelesaikan tutorial Adrian, Anda harus memiliki lingkungan virtual OpenCV yang siap untuk menjalankan eksperimen kami di Pi Anda.

Mari kita pergi ke lingkungan virtual kita dan memastikan bahwa OpenCV 3 telah diinstal dengan benar.

Adrian merekomendasikan untuk menjalankan perintah “source” setiap kali Anda membuka terminal baru untuk memastikan variabel sistem Anda telah disiapkan dengan benar.

sumber ~/.profile

Selanjutnya, mari masuk ke lingkungan virtual kita:

cv kerja

Jika Anda melihat teks (cv) sebelum perintah Anda, berarti Anda berada di cv virtual lingkungan:

(cv) pi@raspberry:~$

Adrian meminta perhatian bahwa lingkungan virtual cv Python sepenuhnya independen dan diasingkan dari versi Python default yang disertakan dalam unduhan Raspbian Stretch. Jadi, semua paket Python di direktori paket situs global tidak akan tersedia untuk lingkungan virtual cv. Demikian pula, paket Python apa pun yang diinstal di paket situs cv tidak akan tersedia untuk instalasi global Python.

Sekarang, masukkan juru bahasa Python Anda:

python

dan konfirmasikan bahwa Anda menjalankan versi 3.5 (atau lebih tinggi)

Di dalam interpreter (">>>" akan muncul), impor perpustakaan OpenCV:

impor cv2

Jika tidak ada pesan kesalahan yang muncul, OpenCV telah diinstal dengan benar DI LINGKUNGAN VIRTUAL PYTHON ANDA.

Anda juga dapat memeriksa versi OpenCV yang diinstal:

cv2.__version__

3.3.0 akan muncul (atau versi superior yang dapat dirilis di masa mendatang). Terminal PrintScreen di atas menunjukkan langkah-langkah sebelumnya.

Langkah 3:Menguji Kamera Anda

Setelah Anda menginstal OpenCV di RPi Anda, mari kita uji apakah kamera Anda berfungsi dengan baik.

Saya berasumsi bahwa Anda telah menginstal PiCam di Raspberry Pi Anda.

Masukkan kode Python di bawah ini pada IDE Anda:

impor numpy sebagai npimport cv2cap =cv2.VideoCapture(0) while(True):ret, frame =cap.read() frame =cv2.flip(frame, -1) # Balik kamera secara vertikal abu-abu =cv2.cvtColor(bingkai, cv2.COLOR_BGR2GRAY) cv2.imshow('bingkai', bingkai) cv2.imshow('abu-abu', abu-abu) jika cv2.waitKey(1) &0xFF ==ord('q'):breakcap.release()cv2.destroyAllWindows()

Kode di atas akan menangkap aliran video yang akan dihasilkan oleh PiCam Anda, menampilkan keduanya, dalam mode warna BGR dan Abu-abu.

Perhatikan bahwa saya memutar kamera saya secara vertikal karena cara perakitannya. Jika ini bukan kasus Anda, beri komentar atau hapus baris perintah “flip”.

Anda juga dapat mengunduh kode dari GitHub saya: simpleCamTest.py

Untuk mengeksekusi, masukkan perintah:

python simpleCamTest.py

Untuk menyelesaikan program, Anda harus menekan tombol [q] atau [Ctrl] + [C] pada keyboard Anda

Gambar menunjukkan hasilnya.

Untuk mengetahui lebih lanjut tentang OpenCV, Anda dapat mengikuti tutorial: loading -video-python-opencv-tutorial

Langkah 4:Deteksi Warna dengan Python Dengan OpenCV

Satu hal yang akan kami coba capai, adalah pendeteksian dan pelacakan objek warna tertentu. Untuk itu, kita harus sedikit memahami bagaimana OpenCV menginterpretasikan warna.

Henri Dang menulis tutorial yang bagus tentang Deteksi Warna dengan Python dengan OpenCV.

Biasanya, kamera kita akan bekerja dengan mode warna RGB, yang dapat dipahami dengan menganggapnya sebagai semua kemungkinan warna yang dapat dibuat dari tiga warna lampu merah, hijau, dan biru. Kami akan bekerja di sini dengan BGR (Biru, Hijau, Merah) sebagai gantinya.

Seperti dijelaskan di atas, dengan BGR, sebuah piksel diwakili oleh 3 parameter, biru, hijau, dan merah. Setiap parameter biasanya memiliki nilai dari 0 – 255 (atau O hingga FF dalam heksadesimal). Misalnya, piksel biru murni di layar komputer Anda akan memiliki nilai B 255, nilai G 0, dan nilai R 0.

OpenCV bekerja dengan model warna HSV (Hue, Saturation, Value), yang merupakan representasi alternatif dari model warna RGB, yang dirancang pada 1970-an oleh peneliti grafis komputer untuk lebih menyelaraskan dengan cara manusia visi merasakan atribut pembuatan warna:

Bagus. Jadi, jika Anda ingin melacak warna tertentu menggunakan OpenCV, Anda harus mendefinisikannya menggunakan Model HSV.

Contoh

Misalnya saya harus melacak objek kuning seperti kotak plastik yang ditunjukkan pada gambar di atas. Bagian yang mudah adalah menemukan elemen BGR-nya. Anda dapat menggunakan program desain apa pun untuk menemukannya (saya menggunakan PowerPoint).

Dalam kasus saya, saya menemukan:

  • Biru:71
  • Hijau:234
  • Merah:213

Selanjutnya, kita harus mengonversi model BGR (71, 234, 213) ke model HSV, yang akan didefinisikan dengan batas rentang atas dan bawah. Untuk itu, mari kita jalankan kode di bawah ini:

impor sysimport numpy sebagai npimport cv2blue =sys.argv[1]green =sys.argv[2]red =sys.argv[3] color =np.uint8([[[biru, hijau] , red]]])hsv_color =cv2.cvtColor(color, cv2.COLOR_BGR2HSV)hue =hsv_color[0][0][0]print("Batas bawah adalah :"),print("[" + str(hue- 10) + ", 100, 100]\n")print("Batas atas adalah :"),print("[" + str(hue + 10) + ", 255, 255]")

Anda juga dapat mengunduh kode dari GitHub saya: bgr_hsv_converter.py

Untuk mengeksekusi, masukkan perintah di bawah ini yang memiliki parameter nilai BGR yang ditemukan sebelumnya:

python bgr_hsv_converter.py 71 234 213

Program akan mencetak batas atas dan bawah warna objek kita.

Dalam hal ini:

batas bawah:[24, 100, 100]

dan

batas atas:[44, 255, 255]

Terminal PrintScreen menampilkan hasilnya.

Terakhir, namun tidak kalah pentingnya, mari kita lihat bagaimana OpenCV dapat "menutupi" objek kita setelah kita menentukan warnanya:

import cv2import numpy as np# Baca gambar - 1 berarti kita ingin gambar di BGRimg =cv2.imread('yellow_object.JPG', 1) # ubah ukuran gambar menjadi 20% di setiap axisimg =cv2.resize(img, (0,0), fx=0.2, fy=0.2)# mengonversi gambar BGR ke gambar HSVhsv =cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # NumPy untuk membuat array untuk menahan bawah dan atas range # “dtype =np.uint8” berarti tipe data adalah 8 bit integerlower_range =np.array([24, 100, 100], dtype=np.uint8) upper_range =np.array([44, 255, 255 ], dtype=np.uint8)# membuat topeng untuk imagemask =cv2.inRange(hsv, lower_range, upper_range)# menampilkan topeng dan gambar secara berdampingancv2.imshow('mask',mask)cv2.imshow ('image', img)# tunggu pengguna menekan [ ESC ]sementara(1):k =cv2.waitKey(0) if(k ==27):breakcv2.destroyAllWindows()

Anda juga dapat mengunduh kode dari GitHub saya: colorDetection.py

Untuk mengeksekusi, masukkan perintah di bawah ini yang memiliki di direktori Anda foto dengan objek target Anda (dalam kasus saya:yellow_object.JPG):

python colorDetection.py

Gambar di atas akan menunjukkan gambar asli ("gambar") dan bagaimana objek akan muncul ("topeng") setelah topeng diterapkan.

Langkah 5:Pelacakan Gerakan Objek

Sekarang kita tahu cara "memilih" objek kita menggunakan topeng, mari lacak pergerakannya secara real time menggunakan kamera. Untuk itu, saya mendasarkan kode saya pada tutorial Pelacakan Bola Adrian Rosebrock dengan OpenCV.

Saya sangat menyarankan Anda membaca tutorial Adrian secara mendetail.

Pertama, konfirmasikan apakah Anda memiliki pustaka imutils diinstal. itu adalah koleksi fungsi kenyamanan OpenCV Adrian untuk membuat beberapa tugas dasar (seperti mengubah ukuran atau layar balik) menjadi lebih mudah. Jika tidak, masuk dengan perintah di bawah ini untuk menginstal perpustakaan di lingkungan Virtual Python Anda:

pip install imutils

Selanjutnya, unduh kode ball_tracking.py dari GitHub saya, dan jalankan menggunakan perintah:

python ball_traking.py

Pada dasarnya, ini adalah kode yang sama dengan Adrian kecuali "video vertikal flip", yang saya dapatkan dengan baris:

frame =imutils.rotate(frame, angle=180)

Juga, perhatikan bahwa batas topeng yang digunakan adalah yang kita dapatkan di langkah sebelumnya.

Langkah 6:Menguji GPIO

Sekarang setelah kita bermain dengan dasar-dasar OpenCV, mari pasang LED ke RPi kita dan mulai berinteraksi dengan GPIO kita.

Ikuti diagram kelistrikan di atas:Katoda LED akan dihubungkan ke GPIO 21 dan anodanya ke GND melalui resistor 220 ohm.

Mari kita uji LED kita di dalam Lingkungan Python Virtual.

Ingat bahwa RPi.GPIO mungkin tidak diinstal di lingkungan virtual Python Anda! Untuk memperbaiki masalah ini, setelah Anda berada di sana (ingat untuk mengonfirmasi bahwa (cv) ada di terminal Anda), Anda perlu menggunakan pip untuk menginstalnya ke lingkungan virtual Anda:

pip install RPi.GPIO

Mari kita gunakan skrip python untuk menjalankan tes sederhana :

import sysimport timeimport RPi.GPIO sebagai GPIO# inisialisasi GPIO dan variabelredLed =int(sys.argv[1])freq =int(sys.argv[2])GPIO.setmode(GPIO.BCM )GPIO.setup(redLed, GPIO.OUT)GPIO.setwarnings(False)print("\n [INFO] LED berkedip (5 kali) terhubung di GPIO {0} setiap {1} detik".format( redLed, freq))untuk i dalam range(5):GPIO.output(redLed, GPIO.LOW) time.sleep(freq) GPIO.output(redLed, GPIO.HIGH) time.sleep(freq)# lakukan sedikit cleanupprint("\n [INFO] Keluar dari Program dan membersihkan barang \n")GPIO.cleanup()

Kode ini akan menerima sebagai argumen nomor GPIO dan frekuensi dalam detik LED kita harus berkedip. LED akan berkedip 5 kali dan program akan dihentikan. Perhatikan bahwa sebelum mengakhiri, kami akan membebaskan GPIO.

Jadi, untuk menjalankan skrip, Anda harus memasukkan sebagai parameter, LED GPIO , dan frekuensi .

Misalnya:

python LED_simple_test.py 21 1

Perintah di atas akan berkedip 5 kali LED merah yang terhubung ke “GPIO 21” setiap “1” detik.

File GPIO_LED_test.py dapat diunduh dari GitHub saya

Layar cetak Terminal di atas menunjukkan hasilnya (dan tentu saja Anda harus mengonfirmasi bahwa LED berkedip.

Sekarang, mari bekerja dengan OpenCV dan beberapa hal dasar GPIO.

Langkah 7:Mengenali Warna dan Interaksi GPIO

Mari kita mulai mengintegrasikan kode OpenCV kita dengan interaksi GPIO. Kami akan mulai dengan kode OpenCV terakhir dan kami akan mengintegrasikan perpustakaan GPIO-RPI di atasnya, jadi kami akan menyalakan LED merah kapan saja objek berwarna kami ditemukan oleh kamera. Kode yang digunakan dalam langkah ini didasarkan pada tutorial hebat Adrian OpenCV, RPi.GPIO, dan GPIO Zero di Raspberry Pi:

Hal pertama yang harus dilakukan adalah "membuat" LED kita, menghubungkannya ke GPIO tertentu:

import RPi.GPIO sebagai GPIOredLed =21GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)GPIO.setup(redLed, GPIO.OUT)

Kedua, kita harus menginisialisasi LED kita (dimatikan):

GPIO.output(redLed, GPIO.LOW)ledOn =False

Sekarang, di dalam loop, di mana "lingkaran" dibuat ketika objek ditemukan, kita akan menyalakan LED:

GPIO.output(redLed, GPIO.HIGH)ledOn =True

Ayo unduh kode lengkapnya dari GitHub saya: object_detection_LED.py

Jalankan kode menggunakan perintah:

python object_detection_LED.py

Cobalah dengan objek yang berbeda (warna dan format). Anda akan melihat bahwa setelah warna cocok di dalam batas topeng, LED akan menyala.

Video di bawah ini menunjukkan beberapa pengalaman. Perhatikan bahwa hanya objek kuning yang tetap berada di dalam rentang warna yang akan terdeteksi, dengan menyalakan LED. Objek dengan warna berbeda diabaikan.

Kami hanya menggunakan LED di sini seperti yang dijelaskan pada langkah terakhir. Saya sudah memasang Pan Tilt saat membuat video, jadi abaikan saja. Kami akan menangani dengan mekanisme PAN/TILT di langkah selanjutnya.

Langkah 8:Mekanisme Pan Tilt

Sekarang kita telah bermain dengan dasar-dasar OpenCV dan GPIO, mari instal mekanisme Pan/tilt kita.

Untuk detailnya, kunjungi tutorial saya: Pan-Tilt-Multi-Servo-Control

Servo harus terhubung ke catu 5V eksternal, memiliki pin datanya (dalam kasus saya, kabel kuningnya) terhubung ke Raspberry Pi GPIO seperti di bawah ini:

  • GPIO 17 ==> Miringkan Servo
  • GPIO 27 ==> Pan Servo

Jangan lupa untuk menghubungkan GND bersama-sama ==> Raspberry Pi – Servos – Catu Daya Eksternal)

Anda dapat memiliki sebagai opsi, resistor 1K ohm secara seri, antara Raspberry Pi GPIO dan pin input data Server. Ini akan melindungi RPi Anda jika terjadi masalah servo.

Mari kita juga menggunakan kesempatan dan menguji servo kita di dalam Lingkungan Python Virtual.

Mari kita gunakan skrip Python untuk menjalankan beberapa pengujian dengan driver kita:

dari waktu impor sleepimport RPi.GPIO sebagai GPIOGPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)def setServoAngle(servo, angle):pwm =GPIO.PWM(servo, 50) pwm .start(8) dutyCycle =sudut / 18. + 3. pwm.ChangeDutyCycle(dutyCycle) 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()

Inti dari kode di atas adalah fungsi setServoAngle(servo, angle). Fungsi ini menerima sebagai argumen, nomor GPIO servo, dan nilai sudut ke tempat servo harus diposisikan. Setelah input dari fungsi ini adalah "sudut", kita harus mengubahnya menjadi siklus tugas yang setara.

Untuk menjalankan skrip, Anda harus memasukkan sebagai parameter, servo GPIO , dan sudut .

Misalnya:

python angleServoCtrl.py 17 45

Perintah di atas akan memposisikan servo yang terhubung pada GPIO 17 ("miring") dengan "elevasi" 45 derajat.

File angleServoCtrl.py dapat diunduh dari GitHub saya

Langkah 9:Menemukan Posisi Realtime Objek

Idenya di sini adalah memposisikan objek di tengah layar menggunakan mekanisme Pan/Tilt. Kabar buruknya adalah untuk memulai kita harus mengetahui dimana letak objek secara real time. Tapi kabar baiknya adalah sangat mudah, setelah kita memiliki koordinat pusat objek.

Pertama, mari kita ambil kode “object_detect_LED” yang digunakan sebelumnya dan memodifikasinya untuk mencetak koordinat x,y dari objek yang ditemukan.

Unduh dari GitHub saya kode: objectDetectCoord.py

"Inti" kode adalah bagian tempat kita menemukan objek dan menggambar lingkaran di atasnya dengan titik merah di tengahnya.

# hanya lanjutkan jika radius memenuhi ukuran minimumjika radius> 10:# gambar lingkaran dan titik berat pada bingkai, # kemudian perbarui daftar titik yang dilacak cv2.circle(frame, (int( x), int(y)), int(radius), (0, 255, 255), 2) cv2.circle(frame, center, 5, (0, 0, 255), -1) # cetak pusat lingkaran koordinat mapObjectPosition(int(x), int(y)) # jika led belum menyala, nyalakan LED jika tidak ledOn:GPIO.output(redLed, GPIO.HIGH) ledOn =True

Mari kita "ekspor" koordinat pusat ke mapObjectPosition(int(x), int(y)) berfungsi untuk mencetak koordinatnya. Di bawah fungsi:

def mapObjectPosition (x, y):print ("[INFO] Pusat Objek berkoordinasi pada X0 ={0} dan Y0 ={1}".format(x, y))

Menjalankan program, kita akan melihat di terminal kita, koordinat posisi (x, y), seperti yang ditunjukkan di atas. Pindahkan objek dan amati koordinatnya. Kita akan menyadari bahwa x bergerak dari 0 ke 500 (kiri ke kanan) dan y dari o ke 350 (atas ke bawah). Lihat gambar di atas.

Bagus! Sekarang kita harus menggunakan koordinat tersebut sebagai titik awal untuk sistem pelacakan Pan/Tilt

Langkah 10:Sistem Pelacakan Posisi Objek

Kami ingin objek kami selalu berada di tengah layar. Jadi, mari kita definisikan misalnya, bahwa kita akan menganggap objek kita "berpusat" jika:

  • 220
  • 160

Di luar batas tersebut, kita harus memindahkan mekanisme Pan/Tilt untuk mengkompensasi penyimpangan. Berdasarkan itu, kita dapat membangun fungsi mapServoPosition(x, y) seperti di bawah ini. Perhatikan bahwa “x” dan “y” yang digunakan sebagai parameter dalam fungsi ini sama dengan yang kita gunakan sebelumnya untuk mencetak posisi tengah:

# posisi servos untuk menampilkan objek di tengah framedef mapServoPosition (x, y):global panAngle global tiltAngle if (x <220):panAngle +=10 jika panAngle> 140:panAngle =140 positionServo (panServo, panAngle) jika (x> 280):panAngle -=10 jika panAngle <40:panAngle =40 positionServo (panServo, panAngle) jika (y <160):tiltAngle +=10 jika tiltAngle> 140:tiltAngle =140 positionServo (tiltServo, tiltAngle) jika (y> 210):tiltAngle -=10 jika tiltAngle <40:tiltAngle =40 positionServo (tiltServo, tiltAngle)

Berdasarkan koordinat (x, y), perintah posisi servo dihasilkan, menggunakan fungsi positionServo(servo, angle). Misalnya posisi y adalah “50”, yang berarti objek kita hampir berada di atas layar, yang dapat diterjemahkan bahwa “penglihatan kamera” adalah “rendah” (misalkan sudut kemiringan 120 derajat) Jadi kita harus “mengurangi” Sudut kemiringan (misalkan 100 derajat), sehingga pandangan kamera akan “naik” dan objek akan “turun” di layar (y akan meningkat katakanlah, 190).

Diagram di atas menunjukkan contoh geometri.

Pikirkan bagaimana kamera Pan akan beroperasi. perhatikan bahwa layar tidak mencerminkan, apa artinya jika Anda memindahkan objek ke "kiri Anda", itu akan bergerak di layar untuk "kanan Anda", setelah Anda berlawanan dengan kamera.

Fungsi positionServo(servo, angle) dapat ditulis sebagai:

def positionServo (servo, angle):os.system("python angleServoCtrl.py " + str(servo) + " " + str(angle)) print("[INFO] Posisi servo di GPIO {0} hingga {1} derajat\n".format(servo, sudut))

Kami akan memanggil skrip yang ditampilkan sebelumnya untuk penentuan posisi servo.

Perhatikan bahwa angleServoCtrl.py harus berada di direktori yang sama dengan objectDetectTrac.py

Kode lengkap dapat diunduh dari GitHub saya: objectDetectTrack.py

Langkah 11:Kesimpulan

Seperti biasa, saya berharap proyek ini dapat membantu orang lain menemukan jalan mereka ke dunia elektronik yang menarik!

Untuk detail dan kode akhir, kunjungi penyimpanan GitHub saya: OpenCV-Object-Face-Tracking

Untuk proyek lainnya, kunjungi blog saya: MJRoBot.org

Saludo dari selatan dunia!

Sampai jumpa di tutorial saya berikutnya!

Terima kasih,

Sumber:  Pelacakan Objek Penglihatan Otomatis


Proses manufaktur

  1. Pemrograman Berorientasi Objek Python
  2. Pelacakan Bola Raspberry Pi
  3. Speathe
  4. Real-Time Face Recognition:Proyek End-to-End
  5. Python - Berorientasi Objek
  6. Menentukan Akurasi Pelacakan Objek Dinamis
  7. Filter Meningkatkan Visi Robot pada Estimasi Pose 6D
  8. Apa itu Mesin Press Otomatis?
  9. Apa itu Power Press Otomatis?
  10. Apa itu Penyok Pipa Otomatis?