Witam. Mam ustawioną kamerę i projektor na suficie. Projektor puszcza obraz na podłogę a kamera widzi podloge (obraz projektora i trochę wiecej). Rozdzielczość projektora to 1024x768 a kamery 640x480. Mam napisana bibliotekę do wykrywania ruchu z obrazu kamery. No i teraz sie zaczyna problem. Biblioteka zwraca prostokąt z współrzędnymi i kątem obrotu. Jak przenieść te współrzędne z rozdzielczości kamery na rozdzielczość okna?
Każda z bibliotek 2D ma to w podstawowych funkcjach.
Nawet WinApi
Korzystam z emgucv, wpf i openni. Ale nigdzie czegoś takiego nie znalazłem. Jakaś podpowiedź? Chociażby jaka to funkcja w winApi? W sumie Google też mi nie pomogło, ale pewnie źle pytałem. Jakaś podpowiedź?
Może inaczej może mi ktoś powie gdzie robię błą?
Aktualnie mam funkcję, która przelicza mi współrzędne punktu według takiego wzoru:
x -> współrzędna x punktu z rozdzielczosci kamery;
y -> współrzędna y punktu z rozdzielczości kamery;
x2 -> współrzędna x punktu po przeliczeniu na rozdzielczość okna;
y2 -> współrzędna y punktu po przeliczeniu na rozdzielczość okna;
screen_width -> szerokość okna ( domyślnie 1024 );
screen_height -> wysokość okna ( domyślnie 768 );
cam_width -> szerokość obrazu kamery ( domyślnie 640 );
cam_height -> wysokość obrazu kamery ( domyślnie 480 );
SkalaX = screen_width / cam_width;
SkalaY = screen_height / cam_height;
x2 = x * SkalaX;
y2 = y * SkalaY;
Ponieważ obraz kamery widzi więcej niż projektor puszcza obrazu to zrobiłem sobie konfigurator, w którym mogę zaznaczyć prostokąt w którym chciałbym widzieć interakcje. Więc zmodyfikowałem moje przeliczenia na takie:
x -> współrzędna x punktu z rozdzielczosci kamery;
y -> współrzędna y punktu z rozdzielczości kamery;
X1 -> współrzędna x lewego górnego punktu prostokąta w którym interesuje mnie interakcja;
Y1 -> współrzędna y lewego górnego punktu prostokąta w którym interesuje mnie interakcja;
X2 -> współrzędna x prawego dolnego punktu prostokąta w którym interesuje mnie interakcja;
Y2 -> współrzędna y prawego dolnego punktu prostokąta w którym interesuje mnie interakcja;
x2 -> współrzędna x punktu po przeliczeniu na rozdzielczość okna;
y2 -> współrzędna y punktu po przeliczeniu na rozdzielczość okna;
screen_width -> szerokość okna ( domyślnie 1024 );
screen_height -> wysokość okna ( domyślnie 768 );
cam_width -> szerokość obrazu kamery ( domyślnie 640 );
cam_height -> wysokość obrazu kamery ( domyślnie 480 );
SkalaX = screen_width / (X2 - X1);
SkalaY = screen_height / (Y2 - Y1);
x2 = (x - X1) * SkalaX;
y2 = (y - Y1) * SkalaY;
Ale i w jednym i drugim przypadku jak przeliczę współrzędne prostokąta to nie pokrywają się one z tym gdzie ja stoję. Czyli prostokąt zawsze jest przesunięty. I stąd moje pytanie jak przeliczyć ten punkt. Nie czekałem na gotową odpowiedź, tylko prosiłem o pomoc.
skalowanie liniowe X w przedziale LeftX–RightX skalujemy do Y w przedziale LeftY–RightY, ne koniecznie Left<Right
Y=(RightY*(X-LeftX)-LeftY*(X-RightX))/(RightX-LeftX)
Możesz mi to troszkę objaśnić? Chodzi mi twój zapis:
Y=(RightY*(X-LeftX)-LeftY*(X-RightX))/(RightX-LeftX)
Y -> to pewnie współrzędna Y już po przeliczeniach
RightY to y z prawego dolnego rogu obszaru?
LeftX to x z lewego górnego rogu obszaru?
LeftY to y z lewego górnego rogu obszaru?
RightX to x z prawego dolnego rogu obszaru?
a X to pewnie współrzędna x już po przeliczeniach?
Nie do końca wiem, czy dobrze rozumiem :(
A X dobrze liczę?