Dörtgen dikdörtgenin içine nasıl çıkarılır?


10

tl; dr: Yansıtmalı geometride matematik problemi: A, B, C, D noktaları ünite kutusunun kenarlarında bir yerde olacak şekilde aşağıda gösterildiği gibi bir projeksiyon veren 4x4 kamera matrisi nasıl bulunur (ör. OpenGL normalleştirilmiş cihaz koordinatları) ve birim kutusunun köşeleri EA, EB, EC, ED ışınları boyunca makul bir yere düşer?

(Bu muhtemelen bir homografi, bir perspektif ve / veya bir kolinasyonun özel bir durumu olabilir. Terminolojiye aşina değil.)


özen

Görünüm alanında dörtgen bir ABCD göz önüne alındığında, onu bir dikdörtgene eşleyen benzersiz (?) Bir dönüşüm olduğunu düşünüyorum. Aşağıdaki resimde görüldüğü gibi: görünüm penceresindeki dörtgen ABCD fiziksel bir 'pencere' gibi davranır ve bir dikdörtgene tekrar eşlersek, bozuk görünecektir.

resim açıklamasını buraya girin

(sağdaki kutu daha sonra konuşacağım NDC'yi temsil eder)

Amaç sağdaki görüntüyü hızla elde etmektir. Görüntüyü elde etmek için her şeyi raytrace edebiliriz (yaptığım), ancak OpenGL veya diğer projektif teknikleri kullanmayı tercih ederim çünkü karıştırma, ilkel vb. Şeylerden yararlanmak istedim.

ilk girişim

I 3x4 bulmak sorunu çözebilir inanıyoruz kamera matrisi 3 + 1 boyutlu hale homojen koordinat (solda) 3-alan ve aşağıya 2 boyutlu 2 + 1 boyutlu homojen koordinatlara projeleri, içerisinde (ilgili doğru). Kamera matrisinin bilinmeyen girişleri için bir denklem sistemi elde etmek ve sistemi tekil değer ayrışımı kullanarak çözmek için doğrudan doğrusal dönüşümü kullanarak bunu çözebiliriz.Ba=0a(SVD). EA, EB, EC, ED vektörlerini (E, fiziksel gözünüz veya dünya uzayındaki kameradır) ön görüntüdeki noktalar olarak alır ve (0,0), (1,0), (1 , 1), (0,1) veya post-görüntüdeki noktalar gibi bir şey ve her bir nokta çifti SVD'ye takılması için birkaç lineer denklem verir. Ortaya çıkan matris EA -> (0,0) vb.

Ama benim üzüntüme göre OpenGL böyle çalışmaz. OpenGL, 3x4 matris ile doğrudan 3d'den 2d'ye yansıtmaz. OpenGL, üç boyutlu noktalar olan "normalleştirilmiş cihaz koordinatları" (NDC) gerektirir. NDC'ye projeksiyon yaptıktan sonra, 'birim' kutusundaki (-1, -1, -1,1) ila (1,1,1,1) arasındaki her şey çizilir; dışarıdaki her şey kırpılır (homojen koordinatlarla uğraştığımız için: herhangi bir nokta (x, y, z, w) yalnızca (x / w, y / w, z / w'nin ilk üç koordinatı varsa ekranda görünecektir. , 1) -1'den 1'e kadar olan ünite kutusunun içindedir).

Yani soru şu: homojen koordinatlarda (özellikle solda çizilen küboid, ABCD (ön noktalar) ve A'B'C'D '(arka noktalar, gizli) ile bazı garip görünümlü küboidleri eşleyen makul bir dönüşüm var mı? ön noktaların arkasında)) birim küpüne, örneğin 4x4 matris kullanarak? Biri nasıl yapar?

ne denedim

Daha güçlü bir şey denedim: ABCD ve A'B'C'D 'nin normal piramidal bir hayal kırıklığı (örn. Gl frustrum) gibi görünmesini sağladım (yani bu varsayımsal kurulumda, soldaki görüntünün üzerine bindirilmiş siyah bir dikdörtgen olurdu dörtgen değil) ve daha sonra iddia edilen 4x4 matrisini çözmek için DLT / doğrudan doğrusal dönüşümü kullandı. Ancak denediğimde, yeterli serbestlik derecesi yoktu ... ortaya çıkan 4x4 matrisi, her girdi vektörünü her çıktı vektörüne eşlemedi. A, B, C, D, A '(5 çift ön dönüştürme ve dönüştürme sonrası vektörler) kullanırken, I / neredeyse / istediğim sonucu elde ederim ... vektörler doğru şekilde eşleştirilir, ancak örneğin B', C ', D', (-1, -1,1,1) yerine (3,3,1,1) ile eşlenir ve OpenGL tarafından kırpılır. Altıncı bir nokta eklemeyi denersem (4x4 matrisinin projelendirilmesi için 6 çift puan), benim çözümüm dejenere görünüyor (sıfırlar, sonsuzlar). Burada kaç derece serbestlikle uğraşıyorum ve bildiğimiz ve sevdiğimiz olağan 4 vektörleri (3 + 1 boyutlu homojen koordinat vektörleri) eşleyen bir 4x4 matrisi ile bu mümkün mü?

rastgele küçük düşünceler

4x4 matris ile herhangi bir keyfi küboid herhangi bir keyfi küboid eşlemek mümkün olmadığını tahmin ediyorum, çünkü ben karışık çünkü ben herhangi bir dışbükey dörtgen herhangi bir diğer dışbükey dörtgen ile 2d gibi bazı matris ile eşlemek mümkün olduğunu düşündüm , diyelim, Photoshop? ... bu bir projektif dönüşümle yapılamaz / yapılamaz mı? Ve 3d'ye nasıl genelleme yapar? ...... Ayrıca 4x4 matris bulma girişimi düşünüldüğünde, lineer cebir, bir NxN matrisinin N'den bağımsız olarak N'den bağımsız noktalardan N hedef noktalarına eşlemesini beklemememiz gerektiğini söylüyor, ancak bir şekilde homojen hissediyorum Koordinatlar bunu dolandırıyor çünkü devam eden gizli bir lineerlik var mı? Sanırım hayır?

başka bir çözüm?

Sanırım biri de aşağıdaki çirkin bir şeyi yapabilir, burada tipik bir hayal kırıklığı kamera projeksiyon matrisi kullanırsınız, köşelere karşılık gelen 2d noktalarını bulursunuz, daha sonra 2d perspektif deformasyon homografisi gerçekleştirebilirsiniz, ancak bu pikseller oluşturulduktan sonra gerçekleşecekse (örn. photoshop) o zaman çözünürlükle ilgili sorunlar olurdu ... belki varsayımsal olarak, bu dönüşümü NDC uzayı içindeki XY düzleminde gerçekleştirmek için bir matris bulabilir, sonra normal hayal kırıklığına dayalı matrisle oluşturabilir?

(not [a]: Serbestlik derecesi: ABCD, bir dikdörtgene etki eden bir projektif dönüşümün post-görüntüsü olarak daha da kısıtlanabilir, gerekirse ... soldaki siyah dikdörtgenin resim çerçevesi küçük resim modelini yansıtmanın sonucu)


1
Köşe pimi için google, bunun birkaç uygulaması olsun
joojaa

Yanıtlar:


1

Bence çözüm, dört noktayı doğru bir şekilde dönüştüren projektif dönüşümü arıyor.

yani

y'=Pxx'

x'=[x0,x1,1]y=[y0'y2',y1'y2']

P , 9 girişli 3x3'lük bir matristir. Son normalizasyon nedeniyle, yazışma tarafından verilen 8 denklemle (nokta çifti başına 2) benzersiz olarak belirlenen, 8 serbestlik derecesi bırakarak ölçeklendirmeye kadar benzersizdir.

Şimdi bunu yapmak için cebiri kullanabilir veya sadece OpenCV'leri kullanabilirsiniz getPerspectiveTransform:).

Ayrıca kontrol homnogenous koordinatları kavramına aşina olsun wikipedia.


Teşekkür ederim! (Bunu bir süre önce
çözdüm

0

Doğrudan Doğrusal Dönüşüm'ü uygulayarak kendi sorumu çözdüm . Wikipedia'daki örnekler bölümü benim kullanım durumumdu.

Denklemleri elde etmek için matrisleri (örn. [x1 x2 x3 x4; x5 x6 x7 x8; x9 x10 x11 x12]) SageMath gibi favori bilgisayar cebir sisteminize takın, ardından gerekli matris denklemini gösterildiği gibi çözün, değişkenler açısından çözümleri kopyalayın ve biçimlendirmeyi ayarlayın.

Daha sonra, belirli boyutları uygun şekilde ölçekleyerek veya yok sayarak çözümü kullanım durumuna uyarlayabilirsiniz (örneğin, kullanım durumuna uygun olarak Normalleştirilmiş Cihaz Koordinatları matrisindeki derinlik / z koordinatını göz ardı edin).

Kendi dilinizde bir SVD ayrıştırma işlevine veya kitaplığına ihtiyacınız olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.