Visi robot Raspberry Pi: peta kedalaman
Saat ini, semua teknologi "drone building" secara aktif semakin murah. Kecuali satu: dapatkan peta ruang di sekitarnya. Ada dua ekstrem: baik lidar mahal (ribuan dolar) dan solusi optik untuk membangun peta kedalaman (ratusan dolar), atau solusi yang sangat sepi seperti pengukur jarak ultrasonik.Oleh karena itu, muncul ide berdasarkan Raspberry Pi murah dengan satu kamera untuk membuat solusi yang akan berada di ceruk kosong dan akan memungkinkan Anda untuk mendapatkan peta kedalaman "murah". Dan untuk melakukan ini dalam bahasa pemrograman sederhana seperti Python, sehingga tersedia bagi pemula untuk bereksperimen. Sebenarnya, saya ingin memberi tahu tentang hasil saya. Skrip yang dihasilkan dengan sampel foto juga dapat dijalankan di desktop.Kedalaman peta dari satu kamera.
Pertama, beberapa kata tentang bagian optik. Untuk membuat peta kedalaman, dua gambar selalu digunakan - dari kamera kiri dan kanan. Dan kami memiliki raspberry dengan satu kamera. Oleh karena itu, pembagi optik dikembangkan, yang sebagai hasilnya memberikan pasangan stereo ke kamera.Secara sederhana - jika Anda melihat foto, maka dari kotak hitam dua mata kamera melihat Anda. Tetapi sebenarnya kameranya adalah satu. Hanya sedikit keajaiban optik.
Foto menunjukkan iterasi kedua belas perangkat. Butuh waktu lama untuk mendapatkan desain stabil yang andal, yang pada saat yang sama tidak mahal. Bagian yang paling sulit adalah cermin internal, yang dibuat sesuai pesanan dengan deposisi vakum aluminium. Jika Anda menggunakan cermin standar, di mana lapisan reflektif terletak di bawah kaca, dan tidak di atasnya, maka di persimpangan mereka membentuk celah yang secara radikal merusak seluruh gambar.Apa yang akan kita kerjakan
Gambar raspberry dari Wheezy Raspbian diambil sebagai basis, Python 2.7 dan OpenCV 2.4 diinstal, well, paket yang diperlukan untuk hal-hal kecil - matplotlib, numpy dan lainnya. Segala macam dan tautan ke gambar kartu yang telah selesai diletakkan di akhir artikel. Deskripsi skrip dalam bentuk pelajaran dapat ditemukan di situs web proyekMempersiapkan gambar untuk membangun peta mendalam
Karena solusi kami tidak terbuat dari logam dan tanpa optik ultra-presisi, penyimpangan kecil dari geometri ideal dimungkinkan sebagai hasil perakitan. Plus, kamera terpasang ke perangkat dengan sekrup, sehingga posisinya mungkin tidak ideal. Masalah dengan lokasi kamera diselesaikan secara manual, dan kompensasi untuk "kelengkungan" dari perakitan struktur akan dilakukan dalam perangkat lunak.Script One - Camera Alignment
Persimpangan cermin dalam gambar idealnya harus vertikal dan terpusat. Sulit melakukannya dengan mata, jadi skrip pertama dibuat. Ini hanya menangkap gambar dari kamera dalam mode pratinjau langsung, menampilkannya di layar, dan di tengah overlay menarik garis putih di sepanjang penyelarasan berlangsung. Setelah kamera diorientasikan dengan benar, kami mengencangkan sekrup lebih keras dan perakitan selesai.Yang menarik dari kode skrip pertama- –
- – , cv.imshow() , . , . , , .
- – , .. . «» , camera.hflip = True
Script kedua - kita mendapatkan pasangan stereo "bersih"
Gambar kiri dan kanan kita bergabung di tengah gambar. Sambungan dalam foto memiliki lebar bukan-nol - Anda dapat menghilangkannya hanya dengan melepas cermin dari perangkat, yang memperbesar ukuran struktur. Kamera raspberry memiliki fokus yang diatur ke tak terhingga, dan objek yang letaknya dekat (dalam kasus kami, ini adalah persimpangan) cukup "kabur". Oleh karena itu, Anda hanya perlu memberi tahu skrip, yang menurut kami merupakan zona "buruk", sehingga pasangan stereo dipotong bersih menjadi gambar. Skrip kedua dibuat yang menampilkan gambar dan memungkinkan Anda menggunakan tombol untuk menunjukkan zona yang akan dipotong.Begini prosesnya:Yang menarik dari kode skrip kedua- , , cv2.rectangle(). , , . , , Enter .
- , . , .
- JSON. , , .
- . , , , . , ./src . . pf_1280_720.txt – , .
- , . . :
loadImagePath = ""
Script ketiga - serangkaian foto untuk kalibrasi
Ilmu pengetahuan dasar mengatakan bahwa agar berhasil membangun peta kedalaman, pasangan stereo harus dikalibrasi. Yaitu, semua titik kunci dari gambar kiri harus pada ketinggian yang sama dan di gambar kanan. Dalam situasi ini, fungsi StereoBM, yang merupakan satu-satunya waktu nyata kami, dapat berhasil melakukan tugasnya.Untuk kalibrasi, kita perlu mencetak gambar referensi, membuat serangkaian foto dan memberikannya ke algoritma kalibrasi, yang akan menghitung semua distorsi dan menyimpan parameter untuk mengembalikan gambar ke normal.Jadi, cetak " papan catur " dan rekatkan pada permukaan yang rata dan keras. Untuk mempermudah, foto serial dibuat skrip dengan penghitung waktu mundur, yang ditampilkan di atas video.Inilah yang terlihat seperti skrip fotografi serial di tempat kerja:Yang menarik dari kode skrip ke-3- . , . , , «» . , – , . camera.capture () , use_video_port=True.
- – camera.annotate_text() . 5 – .
- -, , ./src
Perlu dicatat bahwa "kebenaran" seri yang dibuat sangat penting untuk hasil kalibrasi. Beberapa saat kemudian kita akan melihat hasil yang diperoleh dengan mengambil foto yang salah.Script 4 - memotong foto pada pasangan stereo
Setelah serangkaian foto diambil, kami akan membuat skrip layanan lain yang mengambil seluruh rangkaian foto yang dibuat dan memotongnya menjadi pasangan gambar - kiri dan kanan, dan menyimpan pasangan ke folder ./pairs Melihat potongan berpotongan memungkinkan kita untuk mengevaluasi seberapa baik kita mengatur penghapusan defocused. zona di tengah gambar. Skripnya cukup biasa, jadi saya sembunyikan videonya di bawah spoiler.Contoh karya dan tautan ke sumber skrip ke-4 Yang paling menarik adalah kalibrasi, skrip kelima
Skrip kalibrasi mengumpankan semua pasangan stereo dari folder ./src ke fungsi kalibrasi dan mempertimbangkannya. Setelah kerja kerasnya (untuk 15 gambar 1280x720 pada raspberry pertama yang dibutuhkan sekitar 5 menit), ia mengambil pasangan stereo terakhir, "mengoreksi" gambar (memperbaiki) dan menunjukkan versi yang sudah diperbaiki dengan mana Anda dapat membangun peta kedalaman.Begini tampilannya skrip dalam pekerjaan:Yang menarik dari kode skrip ke-5 "Ada yang salah."
Ada kalanya hasil kalibrasi tidak terduga.Berikut adalah beberapa contoh yang mencolok:
Sebenarnya, kalibrasi adalah momen yang menentukan. Apa yang kita dapatkan pada tahap membangun peta kedalaman secara langsung tergantung pada kualitasnya. Setelah sejumlah besar percobaan, daftar persyaratan pemotretan berikut ini tampak:- Gambar catur tidak boleh sejajar dengan bidang foto - selalu pada sudut yang berbeda. Tetapi bahkan tanpa fanatisme - jika Anda memegang papan hampir tegak lurus terhadap bidang foto, maka skrip tidak akan menemukan catur di dalam gambar.
- Cahaya, cahaya yang bagus. Dalam pencahayaan ruangan rendah, dan bahkan ketika mengeluarkan gambar dari video, kualitas gambar menurun. Dalam kasus saya, cahaya dalam 90% kasus segera memperbaiki situasi.
- Internet menulis bahwa dewan harus menempati ruang maksimum dalam gambar bila memungkinkan. Sangat membantu.
Inilah yang terlihat seperti pasangan stereo "tetap" dengan hasil kalibrasi yang baik:
Script 6 - upaya pertama untuk membangun peta mendalam
Seakan semuanya sudah siap - Anda sudah bisa membangun peta yang dalam.Kami memuat hasil kalibrasi, mengambil foto dan dengan berani membangun peta kedalaman menggunakan cv2.StereoBM Kami mendapatkan sesuatu seperti ini:
Hasilnya tidak terlalu mengesankan, jelas kami perlu memutar sesuatu. Baiklah, mari lanjutkan untuk menyempurnakan tuning pada skrip ke-7 berikutnya. Di sana kita akan menggunakan bukan 10 parameter untuk konstruksi, seperti pada StereoBM (), tetapi hampir 10, yang jauh lebih menarik.Berikut adalah sumber-sumber skrip ke-6Script 7 - depth map dengan pengaturan tingkat lanjut
Ketika parameter bukan 2 tetapi 10, maka memilah-milah pilihan mereka dengan restart skrip yang salah adalah salah. Oleh karena itu, skrip dibuat untuk penyetelan interaktif kedalaman peta yang interaktif. Tugasnya bukan untuk menyulitkan kode dengan antarmuka, jadi semuanya dilakukan pada matplotlib. Gambar antarmuka di matplotlib pada raspberry cukup lambat, jadi saya biasanya mentransfer folder yang berfungsi dari raspberry ke laptop dan memilih parameter di sana. Begini cara kerja skrip:Setelah Anda memilih parameter, skrip dengan tombol Simpan menyimpan hasilnya ke file 3dmap_set.txt dalam format JSON.Yang menarik dari kode skrip ke-7- 7-
- . , - , .
- , . , numOfDisparities 16, . update(val), . numOfDisparities 65.57 64. , .
- matplotlib , .
Pekerjaan praktis dengan peta kedalaman menunjukkan bahwa, pertama-tama, Anda perlu memilih parameter minDisparity, dan bersamaan dengan itu numOfDisparities. Nah, ingat bahwa numOfDisparities sebenarnya berubah secara terpisah, dengan langkah 16.Setelah mengatur pasangan ini, Anda dapat bermain-main dengan parameter lain.Fitur pengaturan kartu sudah menjadi masalah selera pengguna, dan tergantung pada tugas yang diselesaikan. Anda dapat membawa peta ke sejumlah besar bagian kecil atau menampilkan area yang diperbesar. Untuk menghindari rintangan oleh robot secara sederhana, yang kedua lebih cocok. Untuk titik cloud, yang pertama, tetapi masalah kinerja muncul di sini (kami akan kembali kepada mereka).Apa yang ingin kita lihat?
Nah, mungkin salah satu poin terpenting adalah penyesuaian "rabun jauh" dari perangkat kita. Saat mengatur peta kedalaman, saya biasanya menempatkan satu objek pada jarak sekitar 30 cm, yang kedua dalam satu meter, dan sisanya dua meter. Dan ketika mengatur dua parameter pertama (minDisparity dan numOfDisparities) di skrip ke-7, saya mencapai yang berikut:- Objek terdekat (30 cm) - merah
- Obyek dalam setengah meter - kuning atau hijau
- Objek 2-3 meter - hijau atau biru muda
Hasilnya, kami mendapatkan sistem yang dikonfigurasikan untuk mengenali zona "dekat" hambatan dalam radius 5-10 meter.Bekerja dengan video on the fly - script 8, final
Nah, sekarang kami memiliki sistem kustom yang sudah jadi, dan kami harus mendapatkan hasil yang praktis. Kami mencoba membangun peta mendalam secara real time menggunakan video dari kamera kami, dan menunjukkannya secara real time saat pembaruan.Yang menarik dari kode skrip ke-8 Dalam perlombaan untuk kecepatan
Jadi, pengukuran pertama dilakukan pada Raspberry pertama dengan prosesor single-core.- 4 detik - membangun peta pada gambar 1280x720 Ini sangat banyak.- 2,5 detik - pada Raspberry Pi 2, sudah lebih baik.Analisis menunjukkan bahwa dalam kasus ini, hanya satu inti yang digunakan pada raspberry kedua. Kekacauan! Saya membangun kembali OpenCV menggunakan perpustakaan paralelisasi TBB.- 1,5 detik - peluncuran pada raspberry kedua menggunakan multi-core. Faktanya, ternyata hanya 2 core yang digunakan - ini masih harus diutak-atik. Ternyata bukan saja saya menemukan masalah ini , jadi masih ada ruang untuk bergerak.Dilihat oleh algoritma, kecepatan operasi harus secara linear tergantung pada ukuran data yang diproses. Karena itu, jika Anda mengurangi resolusi sebanyak 2 kali, maka secara teoritis semuanya akan bekerja 4 kali lebih cepat.- 0,3 detik , atau sekitar 3-4 FPS - dengan resolusi 640x360 yang dikurangi setengahnya. Teorinya dikonfirmasi.Rencana selanjutnya
Pertama-tama, saya ingin mendapatkan yang terbaik dari multicore raspberry kedua. Saya akan melihat lebih dekat sumber-sumber fungsi StereoBM dan mencoba memahami mengapa pekerjaan tidak berjalan sepenuhnya.Tahap selanjutnya menjanjikan lebih banyak petualangan - ini adalah penggunaan raspberry GPU untuk mempercepat perhitungan.Tiga jalur yang mungkin diambil di sini:Jika Anda memiliki pengalaman bekerja dengan TBB untuk Raspberry OpenCV, atau Anda berurusan dengan pengkodean untuk raspberry GPU, saya akan berterima kasih atas petunjuk tambahan . Saya berhasil menemukan beberapa perkembangan siap pakai untuk satu alasan sederhana - raspberry dengan dua kamera adalah kejadian yang jarang terjadi. Jika Anda mengaitkan dua webcam melalui USB, maka rem besar datang, dan hanya Raspberry Pi Compute yang dapat bekerja dengan dua kamera asli, yang juga membutuhkan papan pengukur yang besar dengan tali dan adaptor.Tautan yang bermanfaat:
Skrip yang berfungsi:Menyiapkan OpenCV dan Python di raspberry:Perpustakaan StereoVision:Kerja GPUNah, sebuah artikel menarik tentang habr tentang " Untuk mengenali gambar, Anda tidak perlu mengenali gambar "Source: https://habr.com/ru/post/id388259/
All Articles