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ć?
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.Odpowiedzi:
Ponieważ algebra wektorowa jest przyjazna dla GPU, do znalezienia czterech rogów oryginalnej płaszczyzny można użyć normalizacji i produktów punktowych:
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
Źródło http://geomalgorithms.com/a05-_intersect-1.html sekcja Przecięcie linii płaszczyzny
źródło