Menjelajahi OpenCV pada StereoPi: Kedalaman Peta dari Video



Hari ini kami ingin berbagi serangkaian contoh tentang Python untuk pelajar OpenCV pada Raspberry Pi, yaitu papan StereoPi dua kamar. Kode yang sudah jadi (ditambah gambar Raspbian) akan membantu Anda menelusuri semua langkah, mulai dengan mengambil gambar dan berakhir dengan mendapatkan peta mendalam dari video yang diambil.

Pendahuluan


Saya harus segera menekankan bahwa contoh-contoh ini adalah untuk perendaman yang nyaman dalam topik, dan bukan untuk solusi produksi. Jika Anda adalah pengguna OpenCV yang maju dan telah berurusan dengan raspberry, maka Anda tahu bahwa untuk pekerjaan penuh disarankan untuk kode pada gigitan, dan bahkan menggunakan raspberry GPU. Di akhir artikel, saya akan menyentuh "bottleneck" dari solusi python dan kinerja keseluruhan secara lebih detail.

Dengan apa kita bekerja


Kami memiliki pengaturan seperti besi:



Papan StereoPi di atas Modul Komputasi Raspberry Pi 3+. Dua kamera paling sederhana terhubung untuk Raspberry Pi versi V1 (pada sensor ov5647).

Apa yang diinstal:

  • Peregangan Raspbian (kernel 4.14.98-v7 +)
  • Python 3.5.3
  • OpenCV 3.4.4 (pra-kompilasi, 'pip' dari Python Wheels)
  • Picamera 1.13
  • Libib StereoVision 1.0.3 (https://github.com/erget/StereoVision)

Proses menginstal semua perangkat lunak berada di luar cakupan artikel ini, dan kami hanya menyarankan mengunduh gambar Raspbian yang sudah selesai (tautan ke github di akhir artikel).

Langkah satu: ambil gambar


Untuk melakukan ini, gunakan skrip 1_test.py

Buka konsol, buka dari folder rumah ke folder dengan contoh:

cd stereopi-tutorial 

Jalankan skrip:

 python 1_test.py 

Setelah memulai, pratinjau gambar stereo kami ditampilkan di layar. Proses dapat terganggu dengan menekan tombol Q. Ini akan menyimpan gambar yang diambil terakhir, yang akan digunakan dalam salah satu skrip berikut untuk mengkonfigurasi peta kedalaman.

Script ini memungkinkan Anda untuk memastikan bahwa semua perangkat keras berfungsi dengan benar, serta mendapatkan gambar pertama untuk digunakan di masa mendatang.

Seperti apa bentuk skrip pertama:


Langkah dua: kumpulkan gambar untuk kalibrasi


Jika kita berbicara tentang kuda bulat dalam ruang hampa, maka untuk mendapatkan peta kedalaman yang berkualitas baik, kita perlu memiliki dua kamera yang benar-benar identik, sumbu vertikal dan optik yang paralel sempurna, dan sumbu horizontal bertepatan. Namun di dunia nyata, semua kamera sedikit berbeda, dan tidak mungkin mengaturnya dengan sempurna. Oleh karena itu, trik kalibrasi perangkat lunak diciptakan. Menggunakan dua kamera dari dunia nyata, sejumlah besar gambar dari objek yang sebelumnya diketahui diambil (kami memiliki gambar dengan papan catur), dan kemudian algoritma khusus menghitung semua "ketidaksempurnaan" dan mencoba untuk memperbaiki gambar sehingga mereka mendekati ideal.

Script ini melakukan tahap pertama pekerjaan, yaitu membantu membuat serangkaian foto untuk kalibrasi.

Sebelum setiap foto, skrip memulai hitungan mundur 5 detik. Kali ini, sebagai aturan, sudah cukup untuk memindahkan papan ke posisi baru, untuk memastikan bahwa pada kedua kamera itu tidak merangkak di tepi, dan memperbaiki posisinya (sehingga tidak ada kekaburan dalam foto). Secara default, ukuran seri diatur ke 30 foto.

Luncurkan:

 python 2_chess_cycle.py 

Proses:


Akibatnya, kami memiliki serangkaian foto di folder / adegan.

Kami memotong gambar menjadi berpasangan


Skrip ketiga 3_pairs_cut.py memotong foto yang diambil menjadi gambar "kiri" dan "kanan" dan menyimpannya di folder / pasang. Sebenarnya, kita dapat mengecualikan skrip ini dan melakukan pemotongan dengan cepat, tetapi sangat berguna dalam percobaan lebih lanjut. Misalnya, Anda dapat menyimpan irisan dari seri yang berbeda, menggunakan skrip Anda untuk bekerja dengan pasangan ini, atau bahkan membuka gambar yang diambil pada kamera stereo lain sebagai pasangan.

Plus, sebelum memotong setiap gambar, skrip menampilkan gambarnya, yang sering memungkinkan Anda untuk melihat foto yang gagal sebelum langkah kalibrasi berikutnya dan cukup menghapusnya.

Jalankan skrip:

 python 3_pairs_cut.py 

Video pendek:


Pada gambar yang sudah jadi ada satu set foto dan pasangan berpotongan yang kami gunakan untuk percobaan kami.

Kalibrasi


Skrip 4_calibration.py menarik semua pasangan dengan papan catur dan menghitung koreksi yang diperlukan untuk memperbaiki gambar. Skrip membuat penolakan otomatis terhadap foto yang tidak ditemukan papan catur, sehingga jika foto yang gagal berhasil, pekerjaan tidak akan berhenti. Setelah semua 30 pasang gambar diunggah, perhitungan dimulai. Dibutuhkan sekitar satu setengah menit bersama kami. Setelah selesai, skrip mengambil salah satu pasangan stereo, dan berdasarkan parameter kalibrasi yang dihitung “mengoreksi” mereka, menampilkan gambar yang diperbaiki pada layar. Pada titik ini, Anda dapat mengevaluasi kualitas kalibrasi.

Dijalankan oleh perintah:

 python 4_calibration.py 

Skrip kalibrasi sedang bekerja:


Pengaturan Peta Kedalaman


Skrip 5_dm_tune.py memuat gambar yang diambil oleh skrip pertama dan hasil kalibrasi. Selanjutnya, sebuah antarmuka ditampilkan yang memungkinkan Anda untuk mengubah pengaturan peta kedalaman dan melihat perubahan apa. Tip: sebelum mengatur parameter, ambil bingkai di mana Anda akan secara bersamaan memiliki objek pada jarak yang berbeda: tutup (30-40 sentimeter), pada jarak rata-rata (meter atau dua) dan di kejauhan. Ini akan memungkinkan Anda untuk memilih parameter di mana objek dekat akan berwarna merah dan objek yang jauh akan menjadi biru gelap.

Gambar berisi file dengan pengaturan peta kedalaman kami. Anda dapat memuat pengaturan kami dalam skrip hanya dengan mengklik tombol "Muat pengaturan"

Kami meluncurkan:

 python 5_dm_tune.py 

Beginilah proses pembuatannya:


Peta Kedalaman Waktu Nyata


Skrip terakhir 6_dm_video.py membuat peta kedalaman dari video menggunakan hasil skrip sebelumnya (kalibrasi dan pengaturan peta kedalaman).

Luncurkan:

 python 6_dm_video.py 

Sebenarnya hasilnya:


Kami berharap skrip kami akan berguna dalam percobaan Anda!

Untuk jaga-jaga, saya akan menambahkan bahwa semua skrip memiliki pemrosesan keystroke, dan Anda dapat mengganggu pekerjaan dengan menekan tombol Q. Jika Anda berhenti "kasar", misalnya, Ctrl + C, proses interaksi Python dengan kamera dapat pecah dan reboot raspberry akan diperlukan.

Untuk lanjutan


  • Script pertama dalam proses menampilkan waktu rata-rata antara tangkapan frame, dan setelah selesai, rata-rata FPS. Ini adalah alat yang sederhana dan nyaman untuk memilih parameter gambar seperti di mana python masih belum "tersedak". Dengannya, kami mengambil 1280x480 pada 20 FPS, di mana video tersebut diberikan tanpa penundaan.
  • Anda mungkin memperhatikan bahwa kami menangkap pasangan stereo dalam resolusi 1280x480, dan kemudian skala ke 640x240.

    Sebuah pertanyaan yang masuk akal: mengapa semua ini, dan mengapa tidak segera mengambil thumbnail dan tidak memuat python kami dengan menguranginya?

    Jawab: dengan pengambilan langsung pada resolusi sangat rendah, masih ada masalah di inti raspberry (gambar pecah). Karena itu, kami mengambil resolusi yang lebih besar, dan kemudian mengurangi gambar. Di sini kita menggunakan sedikit trik: gambar tidak diskalakan dengan python, tetapi dengan bantuan GPU, sehingga tidak ada beban pada inti lengan.
  • Mengapa merekam video dalam format BGRA, bukan BGR?
    Kami menggunakan sumber daya GPU untuk mengurangi ukuran gambar, dan yang asli untuk modul pengubahan ukuran adalah format BGRA. Jika kita menggunakan BGR alih-alih BGRA, kita akan memiliki dua kelemahan. Yang pertama sedikit lebih rendah dari FPS akhir (dalam pengujian kami - 20 persen). Yang kedua adalah konstan konstan di konsol "PiCameraAlfaStripping: menggunakan alpha-stripping untuk mengkonversi ke format non-alpha; Anda mungkin menemukan format alpha yang setara lebih cepat ”. Googling daripadanya mengarah ke bagian dokumentasi Picamera, yang menjelaskan trik ini.
  • Di mana PiRGBArray?

    Ini seperti kelas Picamera asli untuk bekerja dengan kamera, tetapi di sini tidak digunakan. Ternyata dalam pengujian kami, bekerja dengan array numpy "buatan tangan" jauh lebih cepat (satu setengah kali) daripada menggunakan PiRGBArray. Ini tidak berarti bahwa PiRGBArray buruk, kemungkinan besar ini adalah tangan kita yang bengkok.
  • Seberapa dimuat persentase dalam menghitung peta kedalaman?
    Mari kita jawab dengan sebuah gambar:



    Kita melihat bahwa dari 4 core prosesor, pada kenyataannya, hanya satu yang dimuat, dan itu adalah 70%. Dan ini terlepas dari kenyataan bahwa kami bekerja dengan GUI, dan kami mengeluarkan gambar dan peta mendalam kepada pengguna. Ini berarti bahwa ada margin kinerja yang baik, dan penyempurnaan OpenCV dengan OpenMP dan barang lainnya di C, serta mode "pertarungan" tanpa GUI dapat memberikan hasil yang sangat menarik.
  • Berapa peta kedalaman FPS maksimum yang diperoleh dengan pengaturan ini?

    Maksimum yang kami raih adalah 17 FPS, saat mengambil 20 frame per detik dari kamera. Parameter kecepatan "paling responsif" dalam hal pengaturan peta kedalaman adalah MinDisparity dan NumOfDisparities. Ini logis, karena mereka menentukan jumlah "langkah" yang dilakukan dalam algoritma oleh jendela pencarian untuk membandingkan frame. Yang paling responsif kedua adalah preFilterCap, yang memengaruhi, khususnya, “kehalusan” peta kedalaman.
  • Bagaimana dengan suhu prosesor?

    Pada Compute Module 3+ Lite (seri baru, dengan "cap" besi pada prosesnya) itu menunjukkan hasil sebagai berikut:

  • Bagaimana cara menggunakan GPU?

    Minimal, dapat digunakan untuk andistorisasi dan perbaikan gambar secara real time, karena ada contoh (di sini di WebGL ), Python Pi3d , serta proyek Pemrosesan ( contoh untuk raspberry ).

    Ada perkembangan menarik lainnya oleh Koichi Nakamura, yang disebut py-videocore . Dalam korespondensi kami dengannya, ia menyatakan gagasan bahwa untuk mempercepat StereoBM Anda dapat menggunakan intinya dan OpenCV dengan dukungan Cuda . Secara umum, untuk optimasi - keunggulan yang tidak tersentuh, seperti yang mereka katakan.

Terima kasih atas perhatian Anda, dan inilah tautan yang dijanjikan ke sumbernya .

Source: https://habr.com/ru/post/id446872/


All Articles