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.