3D Kinect Noktalarını Kullanarak Keystone Düzeltme


15

XNA ile, zemine yansıtılan basit bir dikdörtgen görüntülüyorum. Projektör keyfi bir konuma yerleştirilebilir. Açıkça, yansıtılan dikdörtgen projektörlerin konumuna ve açısına göre çarpıtılır. Kinect dört köşeyi arayarak zemini tarar. Şimdi amacım orijinal dikdörtgeni, temelde dikdörtgeni önceden eğdirerek projeksiyonun bozulmayacağı şekilde dönüştürmektir.

İlk yaklaşımım her şeyi 2B olarak yapmaktı: Önce warpPerspective()taranan noktalardan iç dikdörtgenin noktalarına bir perspektif dönüşümü (OpenCV'ler kullanarak ) hesaplayın ve dikdörtgenin tersini uygulayın. Bu işe yaramış gibi görünüyordu, ancak GPU'da işlenemediği için çok yavaştı.

İkinci yaklaşım, XNA'nın oluşturma özelliklerini kullanmak için her şeyi 3D yapmaktı. İlk olarak, bir uçak görüntüleyeceğim, Kinect ile köşelerini tarayacağım ve alınan 3D Noktalarını orijinal düzleme eşleyeceğim. Teorik olarak, perspektif dönüşümünün tersini 2B yaklaşımında yaptığım gibi düzleme uygulayabilirim. Ancak, XNA bir görünüm ve projeksiyon matrisi ile çalıştığı için, sadece gibi bir işlevi warpPerspective()çağıramıyorum ve istenen sonucu elde edemiyorum . Kameranın görüş ve projeksiyon matrisi için yeni parametreleri hesaplamam gerekir.

Soru: Bu parametreleri hesaplamak ve bunları iki matrise (görünüm ve projeksiyon) bölmek mümkün müdür? Değilse, kullanabileceğim başka bir yaklaşım var mı?


1
XNA bir Görünüm ve bir Projeksiyon matrisi kullanır, ancak sonuç = vektör * görünüm * projeksiyon düşünüyorum. Neden bir kimlik matrisi görüntülemeye ve ters perspektif matrisini yansıtmaya ve bunun işe yarayıp yaramadığına bakmaya çalışmıyorsunuz? (Bunun tam olarak ne olduğundan% 100 emin değilim)
Roy T.

1
Bir perspektif dönüşümünü tam olarak nasıl hesapladınızwarpPespective ? OpenCV'ye aşina değilim, ancak dokümanı okurken bu fonksiyonun bir görüntüye bir perspektif uyguladığı anlaşılıyor . Yoksa kafam karıştı mı? Her neyse, belki ilk uygulamanızla ilgili daha fazla ayrıntı eklemek yardımcı olabilir.
Laurent Couvidou

PCL kütüphanesine ( pointclouds.org ) bir göz atmak isteyebilirsiniz . Derinlik görüntüsünü kinect'ten dönüştürmek, kamera başlangıç ​​noktasında ve z ekseni boyunca işaret eden bir nokta bulutu verir. Daha sonra uçağı aramak için ransac veya başka bir algoritma kullanabilirsiniz.
Exilyth

Yanıtlar:


1

Vektör cebri GPU dostu olduğundan, orijinal düzlemin dört köşesini aşağıdaki gibi bulmak için normalizasyonlar ve nokta ürünleri kullanılabilir:

resim açıklamasını buraya girin

Projektör noktası (P), yansıtılan nokta (B), çarpık dikdörtgeni (Q) içeren düzlemdeki rastgele bir nokta ve düzlemin (n) normal vektörü, kesişim noktası (A) P'den B'ye doğru bir çizgi çizer ve düzlem şu şekilde verilir:

s = -dot_product(n, P - Q) / dot_product(n, normalized(B - P)) 
A = P + s * normalized(B-P)

Kaynak http://geomalgorithms.com/a05-_intersect-1.html bölüm Çizgi-Düzlem Kavşağı

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.