Selamat siang, para pembaca Habr! Ini adalah bagian kedua dari cerita tentang menggunakan kamera mata ikan pada Raspberry Pi 3. Bagian pertama dapat ditemukan di
sini . Pada artikel ini, saya akan berbicara tentang mengkalibrasi kamera mata ikan dan menggunakan kamera untuk mendeteksi objek menggunakan paket find_object_2d. Siapa yang peduli, tolong, di bawah kucing.
Kalibrasi kamera mata ikan menggunakan camera_calibration
Di sini saya menjelaskan prosedur kalibrasi berdasarkan
manual resmi di portal ros.org.
Untuk melakukan kalibrasi, kita membutuhkan paket kalibrasi kamera. Kita dapat menginstalnya dengan apt:
sudo apt-get install ros-kinetic-camera-calibration
Kami akan membutuhkan templat kotak-kotak. Unduh templat dari
manual resmi di ros.org dan cetaklah. Untuk kenyamanan, saya menempelkannya di papan kayu lapis:

Mari kita jalankan program kalibrasi:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam
Kami akan mendapatkan gambar:

Pindahkan template sedikit dan tunggu sampai template dipilih dalam bingkai (garis berwarna dengan titik-titik tidak akan muncul pada template).


Pindahkan template sedikit lebih ke samping. Untuk berhasil melakukan kalibrasi, kita perlu melakukan serangkaian gerakan template di depan kamera dari sisi ke sisi sehingga template jatuh ke semua posisi sudut di bidang tampilan kamera (kiri, kanan, atas dan bawah). Di sebelah kanan jendela gambar kamera di jendela program adalah panel pendaftaran dengan tiga bilah kemajuan:
- X menangkap pergerakan pola ke arah kiri / kanan (horizontal) di bidang tampilan kamera
- Y menangkap pergerakan pola ke arah atas / bawah (horizontal) di bidang tampilan kamera
- Ukuran menangkap pendekatan / penghapusan template dari kamera dan memiringkan sehubungan dengan kamera.
- Skew memperbaiki kemiringan templat kiri, kanan, atas dan bawah (bevel).
Jadi, untuk kalibrasi yang berhasil, penting bahwa templat muncul di berbagai sudut bingkai, menempati seluruh bingkai dan juga dimiringkan ke kiri, kanan, atas dan bawah.
Mengkalibrasi kamera mata ikan pada Raspberry Pi Anda bisa memakan waktu cukup lama, jadi bersabarlah. Prosedur kalibrasi saya memakan waktu 20 menit.
Ketika kalibrasi selesai, tombol Calibrate harus diaktifkan (disorot dalam warna):

Kita juga dapat melihat hasil kalibrasi di terminal:

Jika Anda puas dengan hasilnya, tekan tombol COMMIT. Jendela program akan ditutup dan Anda akan melihat pesan "menulis data kalibrasi ke ..." di terminal.
Periksa apakah file yang ditentukan telah dibuat:
ll ~/.ros/camera_info/head_camera.yaml -rw-rw-r-- 1 vladimir vladimir 592 Apr 14 14:02 /home/vladimir/.ros/camera_info/head_camera.yaml
Kalibrasi selesai. Sekarang data kalibrasi yang diperoleh dapat digunakan dalam lokalisasi visual dan algoritma SLAM di ROS.
Mendeteksi objek menggunakan find_object_2d
Menginstal
paketnya cukup sederhana. Instal dari repositori apt di Ubuntu 16.04 untuk ROS Kinetic:
sudo apt-get install ros-kinetic-find-object-2d source /opt/ros/kinetic/setup.bash
Jalankan master ROS dan rqt_image_view:
roscore roslaunch usb_cam usb_cam-test.launch
Menggunakan perintah berikut, mulai simpul detektor:
rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw
Jendela program deteksi terbuka:

Di sini kita akan melihat aliran dari kamera dan hasil dari deteksi fitur karakteristik pada objek.
Untuk mulai dengan, kami akan melakukan pelatihan detektor di fasilitas kami. Tempatkan objek pertama di depan kamera:

Klik kanan pada panel kiri Objek di jendela dan opsi Tambahkan objek dari adegan akan terbuka. Pilih opsi ini dan jendela untuk menambahkan objek akan terbuka:

Setelah memilih posisi terbaik untuk objek, klik tombol Ambil Gambar untuk mengambil gambar objek:

Kita harus memilih objek dalam gambar. Gunakan kursor mouse untuk memilih objek:

Klik tombol Next untuk memotong objek dalam gambar dan beralih ke langkah berikutnya. Setelah memotong gambar, kami mendapatkan jumlah fitur karakteristik yang terdeteksi di objek. Tinggal menekan tombol Putus untuk menambahkan objek ke basis data objek detektor terlatih. Di sini kita melihat langkah terakhir dari prosedur untuk menambahkan objek:

Sebagai hasilnya, kami melatih detektor pada satu objek. Sekarang Anda dapat mencoba deteksi objek dalam adegan:

Mari menggambar posisi objek yang terdeteksi ke terminal:
rosrun find_object_2d print_objects_detected
Outputnya akan seperti ini:
Object 1 detected, Qt corners at (259.387238,103.530960) (448.684052,79.495495) (282.419050,240.049667) (458.438938,199.656717) --- Object 1 detected, Qt corners at (255.340408,104.615120) (451.348079,75.302353) (284.672425,230.382223) (452.696585,197.625600) --- Object 1 detected, Qt corners at (253.440521,102.973320) (447.226440,76.793541) (278.530854,238.918013) (454.377219,197.526599) ---
Mari daftar topik:
rostopic list
Dua topik baru muncul dalam daftar: / objects dan / objectsStamped.
Kami menampilkan informasi tentang objek yang terdeteksi:
rostopic echo /objects
layout: dim: [] data_offset: 0 data: [1.0, 266.0, 177.0, 0.7527905702590942, 0.060980819165706635, 0.00022385441116057336, 0.3012462854385376, 0.8929792046546936, 0.0008534671505913138, 334.9065856933594, 182.55294799804688, 1.0] ---
Di sini, nilai kedua dan ketiga (266.0, 177.0) mewakili lebar dan tinggi objek. Semua nilai lain dalam bidang data mewakili matriks homografi 3x3 (digunakan untuk menghitung posisi dan orientasi objek, serta skala dan nilai pergeseran).
Seperti yang ditunjukkan oleh pengamatan, find_object_2d melakukan pekerjaan yang buruk dalam mendeteksi objek dengan tekstur lemah atau tanpa tekstur (tanpa tekstur). Selain itu, detektor tidak efektif ketika mendeteksi suatu objek pada sudut besar ke objek (jika kita mengamati objek dari samping), atau pada jarak yang jauh dari objek.

Setelah menyelesaikan pekerjaan dengan detektor, find_object_2d akan menawarkan kami untuk menyimpan objek yang ditambahkan ke disk.
Itu saja untuk saat ini. Semoga beruntung untuk semua orang dan sampai jumpa lagi!