5.22. Lens ve perspektif düzeltmesi¶
İki sınıf geometrik düzeltme, görüntüyü dikdörtgenden dikdörtgene bir eşlemenin yapamayacağı şekillerde çarpıtır. Lens düzeltmesi, gerçek bir geniş açılı lensin yarattığı radyal bozulmayı geri alır – düz sahne çizgilerini çerçevenin köşelerine yakın yerlerde görünür eğrilere büken balıkgözü şişkinliği. Perspektif düzeltmesi ise lens sahneye dik tutulmadığında ortaya çıkan trapez (keystone) etkisini geri alır – dünyadaki bilinen bir dikdörtgeni görüntüde dikdörtgen olmayan bir lekeye dönüştüren trapez biçimli çarpılma. Her iki düzeltme de, yakalama tamamlandıktan sonra, kökeni optik olan etkileri geri alır.
5.22.1. Radyal lens bozulması¶
gerçek lens etkileri materyali, ucuz geniş açılı lenslerin yarattığı fıçı (barrel) bozulmasını anlatır. Çerçevenin merkezine yakın pikseller kabaca iğne deliği modelinin öngördüğü yerdedir; kenarlara yakın pikseller ise optik eksenden olan radyal mesafenin karesiyle büyüyen bir miktarda dışa doğru bükülür. Sahnedeki, çerçevenin kenarına yakın geçen düz bir çizgi, yakalanan görüntüde gözle görülür şekilde eğrilir ve düz çizgilerin düz kaldığını varsayan herhangi bir klasik makine görüşü algoritması – AprilTag köşe tespiti, kenar takibi, çizgi takipli navigasyon – köşelere yakın yerlerde yanlış sonuç verir.
lens_corr(), bozulmayı geri alır. Yöntem ters eşlemeyi çalıştırır: her çıkış pikseli, lensin onu dışa doğru büktüğü girişteki konumdan örneklenir ve sonuç geometrik olarak düz bir görüntü olur.
img.lens_corr(strength=1.8)
strength parametresi düzeltmenin kalbidir. Lensin ne kadar güçlü büktüğünü tanımlayan tek bir sayıdır; 1.0 değerine yakın bir değer, orta derecede geniş bir lens için hafif bir düzeltmedir ve yaklaşık 2.0 değerine kadar olan değerler güçlü bir balıkgözü için makuldür. Varsayılan 1.8 değeri, standart OpenMV Cam lensleri için makul bir başlangıç noktasıdır; herhangi belirli bir lens için doğru değer, birkaç değer deneyip görüntüyü izleme meselesidir.
İki yan parametre genellikle varsayılan değerlerinde iyi çalışır. zoom (varsayılan 1.0) çıkışı ölçekler – birden büyük bir değer, lens düzeltmesinin köşeleri daha da dışa itme biçimini telafi etmek için dışa doğru kırpar; daha küçük değerler, görüntü kenarlarında boş pikseller dahil etme pahasına düzeltilmiş sahnenin daha fazlasını görünür bırakır. x_corr ve y_corr, düzeltmenin merkezini görüntünün geometrik merkezinden kaydırır; bu, lens sensörün üzerinde optik olarak ortalanmadığında (alışılmadık bir durum ama bilinmesinde fayda var) kullanışlıdır.
Tipik bir işlem hattı: yakala, geometriyi düzeltmek için bir kez lens_corr() çalıştır, ardından uygulamanın sonuçla gerçekte ne yapacaksa onu çalıştır.
5.22.2. 3D döndürme düzeltmesi¶
Geometrik bozulmanın diğer sınıfı, sensör düzlemi sahne düzlemine paralel olmadığında ortaya çıkan perspektif çarpılmasıdır. Klasik durum, aşağıdan bakılan bir tabela veya plakadır: tabelanın üst kısmı lensten alt kısmından daha uzaktadır, dolayısıyla daha küçük yansır ve yakalanan görüntü dikdörtgeni, üst kenarı alt kenardan kısa bir trapez olarak gösterir.
Çözüm, yakalanan çerçeveye sensör düzlemini sanal olarak sahne düzlemine paralel olacak şekilde yeniden yönlendiren bir 3D döndürme uygulamaktır. Matematik, AprilTag tespitinin bir etiketin pozunu dört köşesinden kurtarmak için kullandığı aynı perspektif eşlemesidir, tersine çalıştırılır: bir döndürme verildiğinde, işlem her çıkış pikselini, döndürmenin geldiği giriş konumuna geri eşler.
rotation_corr() bu düzeltmeyi çalıştırır:
img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)
Üç döndürme parametresi derece cinsindendir ve görüntünün merkezinde bulunan sanal bir kameranın x, y ve z eksenleri etrafındaki döndürmeleri tanımlar. x_rotation kamerayı yukarı veya aşağı eğer (bir duvarın yer seviyesinden çekimi için doğal düzeltme); y_rotation kamerayı sola veya sağa kaydırır (pan); z_rotation kamerayı optik ekseni etrafında döndürür (eğik bir montaj için doğal düzeltme).
x_translation ve y_translation sanal kamerayı döndürmeden yanal olarak hareket ettirir. zoom (varsayılan 1.0) çıkışı ölçekler. fov (varsayılan 60.0) kameranın dikey görüş alanını tanımlar ve projeksiyonu hesaplamak için kullanılır – geometrinin tutarlı kalması için değer gerçek lensle eşleşmelidir.
Keyfi bir eğim ve pan kombinasyonu için, sıfır olmayan birden fazla döndürme tek bir çağrıda birleştirilir. İşlemlerin sırası uygulamanın içinde sabittir; uygulama yalnızca açıları sağlar ve sonuç ortaya çıkar.
5.22.3. Bilinen bir dikdörtgenin düzeltilmesi¶
rotation_corr() yönteminin en yaygın kullanışlı biçimi, giriş görüntüsündeki bilinen bir dikdörtgenin köşelerini tanımlayan dört (x, y) demetinden oluşan bir liste alan corners= anahtar kelimesidir. Yöntem, gerçek bir dikdörtgeni o belirli dört noktaya eşleyecek 3D döndürmeyi hesaplar, o döndürmenin tersini tüm görüntüye uygular ve bilinen dikdörtgenin yeniden dikdörtgen olduğu bir sonuç döndürür:
plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)
Klasik kullanım tam olarak adının ima ettiği şeydir: eğik bir açıdan fotoğraflanmış bir plaka (veya başka herhangi bir dikdörtgen öznitelik). Yukarı akış aşaması plakayı tespit eder ve yakalanan görüntüdeki dört köşe konumunu bildirir; bu köşeleri rotation_corr() yöntemine geçirmek, plakanın gerçek bir dikdörtgen olarak oturduğu, sonraki karakter tanıma veya şablon eşleştirme aşaması için hazır bir görüntü üretir.
Dört köşe biçimi, bir uygulamanın çözmeye çalıştığı problemi çözdüğünde, altı parametreli biçimden çok daha kullanışlıdır. Uygulamanın herhangi bir döndürme açısı tahmin etmesi gerekmez; yalnızca yönteme dört nokta verir ve gerisini yöntemin çözmesine izin verir. Altı parametreli biçim, sahnede tanımlanabilir bir dikdörtgen görünmediğinde ve döndürmenin harici bilgiden (örneğin kalibre edilmiş bir montaj açısı) elle ayarlanması gerektiğinde kullanışlıdır.