que - Calcule la posición mundial de la cámara con OpenCV Python
segmentacion de imagenes python (1)
Quiero calcular la posición de mi cámara en coordenadas mundiales. Esto debería ser bastante fácil, pero no obtengo los resultados que espero. Creo que he leído todo sobre este tema, pero mi código no funciona. Esto es lo que hago:
Tengo una cámara mirando un área.
1) Dibujé un mapa del área.
2) Calculé la homografía haciendo coincidir 4 puntos de imagen con 4 puntos en mi mapa usando cv2.getPerspectiveTransform
3) La homografía H transforma cada coordenada del mundo en coordenadas de la cámara; esto está funcionando correctamente
4) Para calcular la matriz de la cámara, seguí esto :
translation = np.zeros((3,1))
translation[:,0] = homography[:,2]
rotation = np.zeros((3,3))
rotation[:,0] = homography[:,0]
rotation[:,1] = homography[:,1]
rotation[:,2] = np.cross(homography[0:3,0],homography[0:3,1])
cameraMatrix = np.zeros((3,4))
cameraMatrix[:,0:3] = rotation
cameraMatrix[:,3] = homography[:,2]
cameraMatrix = cameraMatrix/cameraMatrix[2][3] #normalize the matrix
5) De acuerdo con esto , la posición de la cámara debe calcularse así:
x,y,z = np.dot(-np.transpose(rotation),translation)
Las coordenadas que obtengo son totalmente incorrectas. El problema debería estar en algún lugar del paso 4 o 5, supongo. ¿Qué pasa con mi método?
Creo que lo tengo ahora. El problema fue con el método descrito en el paso 4. La posición de la cámara no se puede calcular solo desde la matriz de homografía. La matriz intrínseca de la cámara también es necesaria. Entonces, el procedimiento correcto es el siguiente:
1) dibujar un mapa de la zona
2) calibre la cámara usando la imagen del tablero de ajedrez con cv2.findChessboardCorners
esto produce la matriz de la cámara y los coeficientes de distorsión
3) solvePnP con las coordenadas mundiales (3D) y las coordenadas de la imagen (2D). El solvePnP devuelve el origo del objeto en el sistema de coordenadas de la cámara dados los 4 puntos correspondientes y la matriz de la cámara.
4) Ahora necesito calcular la posición de la cámara en coordenadas mundiales. La matriz de rotación es: rotM = cv2.Rodrigues(rvec)[0]
5) La posición x, y, z de la cámara es: cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)