Opencv prácticamente girando / trasladando la cámara a vista de pájaro

Tengo una cámara calibrada donde conozco exactamente los datos intrínsecos y extrínsecos. También se conoce la altura de la cámara. Ahora quiero rotar virtualmente la cámara para obtener una vista de pájaro, de modo que pueda construir la matriz de Homografía con los tres angularjs de rotación y la traducción.

Sé que 2 puntos se pueden transformar de una imagen a otra a través de Homography como

x = K * (Rt * n / d) K ^ -1 * x ‘

Hay algunas cosas que me gustaría saber ahora: si quiero recuperar la coordenada de la imagen en ccs, tengo que multiplicarla con K ^ -1, ¿verdad? Como coordenada de imagen utilizo (x ‘, y’, 1)?

Entonces necesito construir una matriz de rotación para rotar los ccs … pero ¿qué convención debería usar? ¿Y cómo sé cómo configurar mi WCS?

El siguiente paso es la normal y la distancia. ¿Es correcto tomar tres puntos en el suelo y calcular la normalidad de ellos? y es la distancia entonces la altura de la cámara?

También me gustaría saber cómo puedo cambiar la altura de la cámara de observación de aves que parece virtual, de modo que puedo decir que quiero ver el plano de tierra desde 3 metros de altura. ¿Cómo puedo usar el “medidor” de la unidad en la Matriz de traducción y homografía?

Hasta ahora, por ahora, sería genial si alguien pudiera iluminarme y ayudarme. Y por favor no sugiera generar la vista de pájaro con “getperspective”, ya lo he intentado pero de esta manera no es adecuado para mí.

Senna

    Ese es el código que aconsejaría (es uno de los míos), en mi opinión, responde muchas de tus preguntas. Si quieres la distancia, precisaría que está en la matriz Z, el coeficiente (4,3).

    Espero que te ayude…

    Mat source=imread("Whatyouwant.jpg"); int alpha_=90., beta_=90., gamma_=90.; int f_ = 500, dist_ = 500; Mat destination; string wndname1 = getFormatWindowName("Source: "); string wndname2 = getFormatWindowName("WarpPerspective: "); string tbarname1 = "Alpha"; string tbarname2 = "Beta"; string tbarname3 = "Gamma"; string tbarname4 = "f"; string tbarname5 = "Distance"; namedWindow(wndname1, 1); namedWindow(wndname2, 1); createTrackbar(tbarname1, wndname2, &alpha_, 180); createTrackbar(tbarname2, wndname2, &beta_, 180); createTrackbar(tbarname3, wndname2, &gamma_, 180); createTrackbar(tbarname4, wndname2, &f_, 2000); createTrackbar(tbarname5, wndname2, &dist_, 2000); imshow(wndname1, source); while(true) { double f, dist; double alpha, beta, gamma; alpha = ((double)alpha_ - 90.)*PI/180; beta = ((double)beta_ - 90.)*PI/180; gamma = ((double)gamma_ - 90.)*PI/180; f = (double) f_; dist = (double) dist_; Size taille = source.size(); double w = (double)taille.width, h = (double)taille.height; // Projection 2D -> 3D matrix Mat A1 = (Mat_(4,3) < < 1, 0, -w/2, 0, 1, -h/2, 0, 0, 0, 0, 0, 1); // Rotation matrices around the X,Y,Z axis Mat RX = (Mat_(4, 4) < < 1, 0, 0, 0, 0, cos(alpha), -sin(alpha), 0, 0, sin(alpha), cos(alpha), 0, 0, 0, 0, 1); Mat RY = (Mat_(4, 4) < < cos(beta), 0, -sin(beta), 0, 0, 1, 0, 0, sin(beta), 0, cos(beta), 0, 0, 0, 0, 1); Mat RZ = (Mat_(4, 4) < < cos(gamma), -sin(gamma), 0, 0, sin(gamma), cos(gamma), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); // Composed rotation matrix with (RX,RY,RZ) Mat R = RX * RY * RZ; // Translation matrix on the Z axis change dist will change the height Mat T = (Mat_(4, 4) < < 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, dist, 0, 0, 0, 1); // Camera Intrisecs matrix 3D -> 2D Mat A2 = (Mat_(3,4) < < f, 0, w/2, 0, 0, f, h/2, 0, 0, 0, 1, 0); // Final and overall transformation matrix Mat transfo = A2 * (T * (R * A1)); // Apply matrix transformation warpPerspective(source, destination, transfo, taille, INTER_CUBIC | WARP_INVERSE_MAP); imshow(wndname2, destination); waitKey(30); } 

    Este código funciona para mí, pero no sé por qué se intercambian los angularjs de balanceo y afinación. Cuando cambio “alfa”, la imagen se deforma en tono y cuando cambio “beta” la imagen en deformada en rollo. Entonces, cambié mi matriz de rotación, como se puede ver a continuación.

    Además, el RY tiene un error de señal. Puede consultar Ry en: http://en.wikipedia.org/wiki/Rotation_matrix .

    La metrix de rotación que uso:

     Mat RX = (Mat_(4, 4) < < 1, 0, 0, 0, 0, cos(beta), -sin(beta), 0, 0, sin(beta), cos(beta), 0, 0, 0, 0, 1); Mat RY = (Mat_(4, 4) < < cos(alpha), 0, sin(alpha), 0, 0, 1, 0, 0, -sin(alpha), 0, cos(alpha), 0, 0, 0, 0, 1); Mat RZ = (Mat_(4, 4) < < cos(gamma), -sin(gamma), 0, 0, sin(gamma), cos(gamma), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); 

    Saludos