5.23. Perspektif düzeltmesi¶
Uyarı
Keyfi 3’e 3’lük transform matrisi yalnızca OpenMV Cam N6 üzerinde desteklenir – anahtar kelime diğer her kartta sessizce yok sayılır. Başka herhangi bir yerde çalışması gereken uygulamalar, hazır rotation_corr() yöntemini (corners= biçimiyle) kullanmalı veya düzeltilmiş görüntüyü kart dışında önceden hesaplamalıdır.
Hazır rotation_corr() yöntemi, belirli bir perspektif çarpılması ailesini küçük bir parametre kümesinin arkasında paketler ve desteklenen her kartta çalışır. Bazı uygulamalar bu biçime uymayan bir çarpılmaya ihtiyaç duyar: bir dörtgenden diğerine keyfi bir projektif yeniden eşleme, bilinen bir montaj için zaten çevrimdışı olarak hesaplanmış kalibre edilmiş bir düzeltme, yukarı akış bir algoritma tarafından hazır olarak teslim edilen bir çarpılma matrisi. Bunlar için draw_image() – copy(), crop() ve scale() ile birlikte – çarpılmayı doğrudan tanımlayan elle oluşturulmuş bir 3’e 3’lük matris alan bir transform anahtar kelimesini kabul eder.
5.23.1. Afin ve projektif dönüşümler¶
Geometrik çarpılmalar homojen koordinatlar cinsinden ifade edilir: (x, y) piksel konumuna bir 1 eklenir ve 3’e 3’lük bir matrisle çarpılır.
Başlanacak yer afin biçimdir. Alt satırı \((0, 0, 1)\) olarak sabittir:
Açık yazıldığında, her çıkış koordinatı giriş koordinatlarının doğrusal bir kombinasyonu artı bir sabittir:
ki bu ölçekleme, döndürme, kaydırma (shear) ve ötelemeyi herhangi bir kombinasyonda kapsar – ve bunların hepsinde paralel çizgiler paralel kalır.
Projektif (perspektif) biçim, alt satırı serbest bırakır:
Açık yazıldığında:
\(w' = g x + h y + 1\) ile bölme, dönüşümü yalnızca afin değil projektif yapan şeydir. \(g\) ve \(h\) her ikisi de sıfır olduğunda, \(w'\) bir olarak kalır ve bölme hiçbir şey yapmaz – yine afin biçim. Herhangi biri sıfır olmadığında, \(w'\) giriş konumuyla değişir ve farklı konumlardaki pikseller farklı miktarlarda kısalır (foreshorten), bu da artık paralel çizgileri paralel tutmaz – tam olarak düz bir düzleme eğik bir açıdan bakmanın keystone etkisidir. Projektif dönüşüm, düz çizgileri düz çizgilere taşıyan en genel geometrik çarpılmadır; ölçekleme, çevirme, transpoze etme, döndürme ve dört köşeli döndürme düzeltmesinin hepsi bunun özel durumlarıdır.
Adlandırılmış dönüşümler doğrudan afin biçimden ortaya çıkar. Birim dönüşüm birim matristir ve:
Çoğu elle oluşturulmuş dönüşüm için bir uygulama, bunlardan birini temel olarak alır ve her ek işlem için başka matrisleri çarparak, bileşik çarpılmayı tanımlayan tek bir 3’e 3’lük matrisle biter. Matrisler sağdan sola uygulanır: \(M = T R S\) önce ölçeklemeyi, sonra döndürmeyi, sonra ötelemeyi çalıştırır. Eninde sonunda herkesin ihtiyaç duyduğu bileşik, görüntü merkezi etrafında döndürmedir – çıplak bir döndürme matrisi, görüntüyü sol üst köşedeki piksel orijini etrafında çevirir, dolayısıyla merkezlenmiş sürüm \((c_x, c_y)\) merkezini orijine taşır, döndürür ve geri taşır:
5.23.2. transform anahtar kelimesi¶
Matris, 3’e 3’lük bir ulab.numpy.ndarray olarak sağlanan bir transform anahtar kelimesi aracılığıyla girer. Başvurulacak yöntem draw_image() yöntemidir; bu yöntem, kaynağı bir hedefe çizerken matris aracılığıyla çarpıtır – sonuç uygulamanın denetlediği bir arabelleğe iner ve çarpılma çağrıdaki diğer her şeyle birleşir: ölçekleme, alfa karıştırma, maskeleme.
import ulab.numpy as np
M = np.array([[1.2, 0.0, -20.0],
[0.0, 1.2, -15.0],
[0.0, 0.0, 1.0]])
canvas.draw_image(img, transform=M)
Örnek, img görüntüsünü canvas üzerine her yönde 1.2 kat ölçeklenmiş ve sırasıyla 20 ve 15 piksel sola ve yukarı kaydırılmış olarak çarpıtır – yukarıda anlatılan matris girdilerinden doğrudan oluşturulmuş bir afin çarpılma. Aynı anahtar kelime copy(), crop() ve scale() üzerinde çarpılmayı görüntünün kendisine uygular.