Calculez la position de la caméra dans le monde avec OpenCV Python
je veux calculer la position de ma caméra en coordonnées mondiales. Ce devrait être assez facile, mais je n'obtenez pas les résultats que j'attends. Je crois que j'ai tout lu sur ce sujet, mais mon code ne fonctionne pas. Voici ce que je fais:
j'ai une caméra qui regarde une zone.
1) j'ai dessiné une carte de la région.
2) j'ai calculé l'homographie en faisant correspondre 4 points d'image à 4 points sur ma carte en utilisant cv2.getPerspectiveTransform
3) l'homographie h transforme les coordonnées de chaque monde en coordonnées de caméra; cela fonctionne correctement
4) pour calculer la matrice de la caméra j'ai suivi ce :
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) selon cette , la position de la caméra doit être calculée comme ceci:
x,y,z = np.dot(-np.transpose(rotation),translation)
Les coordonnées que j'obtiens sont totalement faux. Le problème devrait être quelque part à l'étape 4 ou 5 je suppose. Quel est le problème avec ma méthode?
1 réponses
je crois que je l'ai maintenant. Le problème était avec la méthode décrite à l'étape 4. La position de la caméra ne peut pas être calculée à partir de la matrice d'homographie seule. La matrice intrinsèque de la caméra est également nécessaire. Ainsi, la procédure correcte est la suivante:
1) Dessinez une carte de la région
2) calibrer la caméra à l'aide de l'image de l'échiquier avec cv2.findChessboardCorners
cela donne la matrice de la caméra et les coefficients de distorsion
3) solvePnP avec les coordonnées du monde (3D) et les coordonnées de l'image (2D). Le solvePnP renvoie l'origo de l'objet dans le système de coordonnées de la caméra étant donné les 4 points correspondants et la matrice de la caméra.
4) Maintenant je dois calculer la position de la caméra en coordonnées mondiales. La matrice de rotation est: rotM = cv2.Rodrigues(rvec)[0]
5) La position x,y,z de la caméra est: cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)