przeniesienie współrzędnych prostokąta z obrazu kamery do okna programu

0

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?

0

Każda z bibliotek 2D ma to w podstawowych funkcjach.
Nawet WinApi

0

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ź?

0

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.

0

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)

0

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ę?

1 użytkowników online, w tym zalogowanych: 0, gości: 1