2016-12-13 2 views
2

J'essaie de calculer projection_matrix en utilisant OpenCV 2.4 en Python 2.7 pour ma caméra (j'utilise ps eye). J'en ai besoin pour cv2.triangulatePoints(). J'ai déjà fait le calibrage en utilisant cv2.calibrateCamera() (en utilisant calibrate.py à partir d'exemples OpenCV), j'ai donc rms, camera_matrix, dist_coefs, rvecs et tvecs.Comment calculer OpenCV camera projectionMatrix en python

Mais j'ai un problème en calculant projection_matrix à partir de ces paramètres (je n'ai trouvé aucun exemple Python en ligne). PS: Dois-je calibrer chaque caméra PS? J'ai 3 et je voudrais suivre l'objet dans l'espace 3D.

+0

voir ceci: http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_calibr ation/py_calibration.html – eyllanesc

Répondre

0

Si vous n'avez qu'une seule caméra, la matrice de projection doit être égale à camera_matrix. Il n'y a qu'une seule complication. Le cv2.triangulatePoints est défini pour fonctionner avec 2 vues de 2 caméras différentes.

Documentation indique également que

La fonction reconstitue des points en 3 dimensions (en coordonnées homogènes ) en utilisant leurs observations avec un appareil photo stéréo. Les matrices de projections peuvent être obtenues à partir de stereoRectify().

Alors oui, vous devez calibrer chaque caméra et calibrer chaque paire de caméras afin de récupérer chaque matrice de la caméra et la matrice de rotation et le vecteur de translation d'une caméra à la « caméra principale ».

Pour un couple donné des caméras, avec K1 et K2 les matrices de la caméra, il est vrai que

La matrice de projection de la caméra principale (la caméra est le système de référence mondial) est

P1 = K1*[I | z] 

où I est la matrice identy et z est un vecteur 0,0,0 dans la quatrième colonne. Vous pourriez penser quelque chose comme

1 0 0 0 
    0 1 0 0 
    0 0 1 0 

Si R est la matrice de rotation entre les 2 caméras et t la distance entre les deux caméras, la deuxième matrice de projection est

P2 = K2*[R | t] 

En python, si vous le pouvez ne pas obtenir les matrices de stereoRectify, une méthode pour le faire manuellement

import numpy as np 
P = np.concatenate((np.dot(K,R),np.dot(K,t)), axis = 1) 
+0

Vouliez-vous dire P2 = K1 * [R | t] pour la deuxième matrice? Cela a plus de sens. – gregorkas

+1

@gregorkas oui, c'était ma faute. Dans la deuxième matrice, l'index 1 devrait être 2: mauvais typage. Je vous remercie! Édité. – marcoresk