5.22. Koreksi lensa dan perspektif

Dua kelas koreksi geometris mewarpkan citra dengan cara yang tidak dapat dilakukan oleh pemetaan persegi panjang ke persegi panjang. Koreksi lensa menghapus distorsi radial yang dihasilkan lensa sudut lebar nyata -- tonjolan fisheye yang membengkokkan garis-garis lurus pada pemandangan menjadi kurva yang terlihat di dekat sudut-sudut bingkai. Koreksi perspektif menghapus efek keystone yang terjadi ketika lensa tidak diarahkan tegak lurus terhadap pemandangan -- warp trapesium yang mengubah persegi panjang yang dikenal di dunia nyata menjadi blob non-persegi panjang pada citra. Kedua koreksi ini membatalkan, setelah pengambilan gambar selesai, efek yang berasal dari optis.

5.22.1. Distorsi lensa radial

Materi efek lensa nyata menjelaskan distorsi barrel yang dihasilkan oleh lensa sudut lebar yang murah. Piksel di dekat pusat bingkai kira-kira berada di posisi yang diprediksi oleh model pinhole; piksel di dekat tepi dibengkokkan ke luar dengan jumlah yang tumbuh sesuai kuadrat jarak radial dari sumbu optis. Garis lurus pada pemandangan yang berjalan di dekat tepi bingkai melengkung secara terlihat pada citra yang diambil, dan setiap algoritma visi mesin klasik yang mengasumsikan garis lurus tetap lurus -- deteksi sudut AprilTag, pelacakan tepi, navigasi mengikuti garis -- mendapatkan jawaban yang salah di dekat sudut.

lens_corr() membatalkan distorsi tersebut. Metode ini menjalankan pemetaan terbalik: setiap piksel keluaran diambil sampelnya dari posisi pada masukan yang akan dibengkokkan lensa ke luar darinya, dan hasilnya adalah citra yang lurus secara geometris.

img.lens_corr(strength=1.8)

Parameter strength adalah inti dari koreksi. Ini adalah angka tunggal yang menjelaskan seberapa kuat lensa membengkok; nilai mendekati 1.0 adalah koreksi ringan untuk lensa sudut lebar sedang, dan nilai hingga sekitar 2.0 wajar untuk fisheye yang kuat. Nilai default 1.8 adalah titik awal yang wajar untuk lensa OpenMV Cam standar; nilai yang tepat untuk lensa tertentu adalah masalah mencoba beberapa nilai dan mengamati citranya.

Dua parameter sisi biasanya baik pada nilai defaultnya. zoom (default 1.0) menskalakan keluaran -- nilai yang lebih besar dari satu memotong ke luar untuk mengkompensasi cara koreksi lensa mendorong sudut-sudut lebih jauh ke luar; nilai yang lebih kecil meninggalkan lebih banyak pemandangan yang telah dikoreksi terlihat dengan biaya menyertakan piksel kosong di tepi citra. x_corr dan y_corr menggeser pusat koreksi menjauhi pusat geometris citra, yang berguna ketika lensa tidak berada tepat di atas sensor secara optis (kasus yang tidak biasa tetapi patut diketahui).

Pipeline tipikal: ambil gambar, jalankan lens_corr() sekali untuk meluruskan geometri, lalu jalankan apa pun yang sebenarnya dilakukan oleh aplikasi dengan hasilnya.

5.22.2. Koreksi rotasi 3D

Kelas distorsi geometris lainnya adalah warp perspektif yang terjadi ketika bidang sensor tidak sejajar dengan bidang pemandangan. Kasus klasiknya adalah papan tanda atau plat nomor yang dilihat dari bawah: bagian atas tanda lebih jauh dari lensa daripada bagian bawah, sehingga diproyeksikan lebih kecil, dan citra yang diambil menampilkan persegi panjang sebagai trapesoid dengan sisi atas lebih pendek dari sisi bawah.

Perbaikannya adalah menerapkan rotasi 3D pada bingkai yang diambil yang secara virtual mengarahkan ulang bidang sensor agar sejajar dengan bidang pemandangan. Matematikanya sama dengan pemetaan perspektif yang digunakan oleh deteksi AprilTag untuk memulihkan pose tag dari empat sudutnya, dijalankan secara terbalik: diberi rotasi, operasi memetakan setiap piksel keluaran kembali ke posisi masukan dari mana rotasi tersebut berasal.

rotation_corr() menjalankan koreksi tersebut:

img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)

Tiga parameter rotasi dalam derajat dan menjelaskan rotasi di sekitar sumbu x, y, dan z kamera virtual yang berpusat pada citra. x_rotation memiringkan kamera ke atas atau ke bawah (koreksi alami untuk foto dari permukaan tanah terhadap dinding); y_rotation menggeser pandangan kamera ke kiri atau kanan; z_rotation memutar kamera di sekitar sumbu optisnya (koreksi alami untuk dudukan yang tidak rata).

x_translation dan y_translation memindahkan kamera virtual secara lateral tanpa memutarnya. zoom (default 1.0) menskalakan keluaran. fov (default 60.0) menjelaskan bidang pandang vertikal kamera, digunakan untuk menghitung proyeksi -- nilainya harus sesuai dengan lensa aktual agar geometri tetap konsisten.

Untuk kombinasi kemiringan dan geseran yang sewenang-wenang, beberapa rotasi non-nol disusun dalam satu panggilan. Urutan operasi ditetapkan di dalam implementasi; aplikasi hanya menyediakan sudut-sudutnya dan hasilnya keluar.

5.22.3. Meluruskan persegi panjang yang diketahui

Bentuk rotation_corr() yang paling umum berguna adalah kata kunci corners=, yang mengambil daftar empat tupel (x, y) yang menjelaskan sudut-sudut persegi panjang yang dikenal dalam citra masukan. Metode ini menghitung rotasi 3D apa pun yang akan memetakan persegi panjang sejati ke empat titik tertentu tersebut, menerapkan kebalikan dari rotasi tersebut ke seluruh citra, dan mengembalikan hasil di mana persegi panjang yang dikenal menjadi persegi panjang lagi:

plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)

Penggunaan klasik adalah persis seperti yang disarankan oleh namanya: plat nomor (atau fitur persegi panjang lainnya) yang difoto dari sudut miring. Tahap hulu mendeteksi plat dan melaporkan empat posisi sudutnya dalam citra yang diambil; memberikan sudut-sudut tersebut ke rotation_corr() menghasilkan citra di mana plat duduk sebagai persegi panjang sejati, siap untuk tahap pengenalan karakter atau pencocokan template berikutnya.

Ketika bentuk empat sudut memecahkan masalah yang ingin diselesaikan oleh aplikasi, ia jauh lebih berguna daripada bentuk enam parameter. Aplikasi tidak perlu memperkirakan sudut rotasi apa pun; ia hanya menyerahkan empat titik ke metode dan membiarkan metode mencari tahu sisanya. Bentuk enam parameter berguna ketika tidak ada persegi panjang yang dapat diidentifikasi yang terlihat dalam pemandangan dan rotasi harus disetel secara manual dari pengetahuan eksternal (sudut pemasangan yang dikalibrasi, misalnya).