Korekcja trapezowa za pomocą 3D-Points of Kinect

15

W XNA wyświetlam prosty prostokąt, który jest rzutowany na podłogę. Projektor można ustawić w dowolnym miejscu. Oczywiście rzutowany prostokąt ulega zniekształceniu w zależności od położenia i kąta rzutnika. Kinect skanuje podłogę w poszukiwaniu czterech rogów. Teraz moim celem jest przekształcenie oryginalnego prostokąta, tak aby rzut nie był już zniekształcony przez zasadniczo wstępne wypaczenie prostokąta.

Moje pierwsze podejście polegało na zrobieniu wszystkiego w 2D: Najpierw oblicz transformację perspektywiczną (używając OpenCV warpPerspective()) od skanowanych punktów do wewnętrznych punktów prostokąta i zastosuj odwrotność do prostokąta. Wydawało się, że to działa, ale było zbyt wolne, ponieważ nie mogło być renderowane na GPU.

Drugie podejście polegało na zrobieniu wszystkiego w 3D w celu korzystania z funkcji renderowania XNA. Najpierw wyświetliłem płaszczyznę, zeskanowałem jej narożniki za pomocą Kinect i zamapowałem otrzymane punkty 3D na oryginalnej płaszczyźnie. Teoretycznie mogłem zastosować odwrotność transformacji perspektywy do płaszczyzny, tak jak to zrobiłem w podejściu 2D. Ponieważ jednak XNA działa z matrycą widoku i projekcji, nie mogę po prostu wywołać funkcji takiej jak warpPerspective()i uzyskać pożądanego rezultatu. Musiałbym obliczyć nowe parametry matrycy widoku i projekcji kamery.

Pytanie: Czy można obliczyć te parametry i podzielić je na dwie macierze (widok i rzut)? Jeśli nie, czy istnieje inne podejście, którego mógłbym użyć?

Philllies
źródło
1
XNA korzysta z macierzy Widok i Projekcja, ale myślę, że efekt końcowy = projekcja wektor * widok *. Dlaczego nie spróbować wyświetlić matrycy tożsamości i odwzorować macierz odwrotnej perspektywy i sprawdzić, czy to zadziała? (Nie jestem w 100% pewien, że tak właśnie się dzieje)
Roy T.
1
Jak dokładnie obliczyć transformacji z perspektywy warpPespective? Nie znam OpenCV, ale czytając dokument wygląda na to, że ta funkcja po prostu stosuje perspektywę do obrazu. Czy jestem zdezorientowany? W każdym razie może pomóc dodanie więcej szczegółów na temat pierwszego wdrożenia.
Laurent Couvidou
Możesz zajrzeć do biblioteki PCL ( pointclouds.org ). Konwersja obrazu głębi z kinect daje chmurę punktów z kamerą na początku, wskazującą wzdłuż osi Z. Następnie możesz użyć ransaca lub innego algorytmu do wyszukiwania samolotu.
Exilyth,

Odpowiedzi:

1

Ponieważ algebra wektorowa jest przyjazna dla GPU, do znalezienia czterech rogów oryginalnej płaszczyzny można użyć normalizacji i produktów punktowych:

wprowadź opis zdjęcia tutaj

Biorąc pod uwagę punkt rzutnika (P), rzutowany punkt (B), jeden dowolny punkt na płaszczyźnie, który zawiera zniekształcony prostokąt (Q) i wektor normalny do tej płaszczyzny (n), punkt przecięcia (A) linia od P do B, a płaszczyzna jest podana przez

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

Źródło http://geomalgorithms.com/a05-_intersect-1.html sekcja Przecięcie linii płaszczyzny

rraallvv
źródło