Homografia OpenCV, transformacja punktu, co robi ten kod?

Pracuję z homografią obliczoną przez OpenCV. Obecnie używam tej homografii do przekształcania punktów za pomocą poniższej funkcji. Ta funkcja wykonuje zadanie, którego wymagam, jednak nie mam pojęcia, jak to faktycznie działa.

Czy ktoś może wyjaśnić, linia po linii dokładnie, logikę/teorię stojącą za ostatnimi 3 linijkami kodu, rozumiem,że to przekształca punkt x, y, ale nie wiem, dlaczego to działa: {]}

Dlaczego są Z, px i py obliczone w ten sposób, co zrobić elementy w h odpowiadają?

Twoje komentarze są bardzo mile widziane:)

double h[9];
homography = cvMat(3, 3, CV_64F, h);
CvMat ps1 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points1);
CvMat ps2 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points2);

cvFindHomography(&ps1, &ps2, &homography, 0);

...

// This is the part I don't fully understand
double x = 10.0;
double y = 10.0;
double Z = 1./(h[6]*x + h[7]*y + h[8]);
px = (int)((h[0]*x + h[1]*y + h[2])*Z);
py = (int)((h[3]*x + h[4]*y + h[5])*Z);
Author: Angie Quijano, 2012-02-14

2 answers

cvFindHomography() zwraca macierz używając współrzędnych jednorodnych :

Współrzędne jednorodne są wszechobecne w grafice komputerowej, ponieważ pozwalają na implementację typowych operacji, takich jak tłumaczenie, obrót, skalowanie i rzutowanie perspektywy jako operacje macierzy

Co się dzieje w kodzie: Punkt kartezjański p_origin_cartesian(x,y) przekształca się do współrzędnych jednorodnych, następnie stosuje się macierz transformacji perspektywy 3x3 h, a wynik jest konwertowane z powrotem do współrzędnych kartezjańskich p_transformed_cartesian(px,py).

UPDATE

W szczegółach:

Konwertuj p_origin_cartesian na p_origin_homogenous:

(x,y)  =>  (x,y,1)

Do transformacji perspektywy:

p_transformed_homogenous = h * p_origin_homogenous =

(h0,h1,h2)    (x)   (h0*x + h1*y + h2)   (tx)   
(h3,h4,h5)  * (y) = (h3*x + h4*y + h5) = (ty) 
(h6,h7,h8)    (1)   (h6*x + h7*y + h8)   (tz)

Konwertuj p_transformed_homogenous na p_transformed_cartesian:

(tx,ty,tz)  =>  (tx/tz, ty/tz) 

Twój kod przetłumaczony:

px = tx/tz;
py = ty/tz;
Z  = 1/tz;
 28
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-16 20:13:36

Implementacja Pythona OpenCV po @ Ben answer

p = np.array((x,y,1)).reshape((3,1))
temp_p = M.dot(p)
sum = np.sum(temp_p ,1)
px = int(round(sum[0]/sum[2]))
py = int(round(sum[1]/sum[2]))
 0
Author: Flayn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 08:40:48