OpenCV Homography, трансформируйте точку, что делает этот код? - PullRequest
16 голосов
/ 14 февраля 2012

Я работаю с гомографией, рассчитанной OpenCV. В настоящее время я использую эту гомографию для преобразования точек, используя функцию ниже. Эта функция выполняет нужную мне задачу, однако я понятия не имею, как она на самом деле работает.

Может кто-нибудь объяснить, строка за строкой, логику / теорию за последние 3 строки кода, я понимаю, что это трансформирует точку x, y, но мне неясно, почему это работает:

Почему Z, px и py рассчитываются таким образом, чему соответствуют элементы в h?

Ваши комментарии с благодарностью:)

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);

Ответы [ 2 ]

28 голосов
/ 14 февраля 2012

cvFindHomography() возвращает матрицу, используя однородные координаты :

Однородные координаты вездесущи в компьютерной графике, поскольку они допускают такие общие операции, как перемещение, вращение, масштабирование и проекция перспективы.для реализации в виде матричных операций

Что происходит в коде: декартова точка p_origin_cartesian(x,y) преобразуется в однородные координаты, затем применяется матрица преобразования перспективы 3x3 h и результат преобразуется обратнов декартовы координаты p_transformed_cartesian(px,py).

ОБНОВЛЕНИЕ

Подробно:

Преобразование p_origin_cartesian в p_origin_homogenous:

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

Перспективное преобразование:

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)

Преобразование p_transformed_homogenous в p_transformed_cartesian:

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

Ваш код переведен:

px = tx/tz;
py = ty/tz;
Z  = 1/tz;
0 голосов
/ 23 февраля 2017

Реализация OpenCV Python после ответа @Ben

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]))
...