2012-11-24 8 views
4

Je suis dans la situation où je dois trouver la position relative de la caméra entre deux caméras ou plus en fonction des correspondances d'images (donc les caméras ne sont pas au même point). Pour résoudre ce problème, j'ai essayé la même approche que celle décrite here (code ci-dessous).Trouver des extrinsèques entre les caméras

cv::Mat calibration_1 = ...; 
cv::Mat calibration_2 = ...; 
cv::Mat calibration_target = calibration_1; 
calibration_target.at<float>(0, 2) = 0.5f * frame_width; // principal point 
calibration_target.at<float>(1, 2) = 0.5f * frame_height; // principal point 

auto fundamental_matrix = cv::findFundamentalMat(left_matches, right_matches, CV_RANSAC); 
fundamental_matrix.convertTo(fundamental_matrix, CV_32F); 
cv::Mat essential_matrix = calibration_2.t() * fundamental_matrix * calibration_1; 
cv::SVD svd(essential_matrix); 
cv::Matx33f w(0,-1,0, 
    1,0,0, 
    0,0,1); 
cv::Matx33f w_inv(0,1,0, 
    -1,0,0, 
    0,0,1); 
cv::Mat rotation_between_cameras = svd.u * cv::Mat(w) * svd.vt; //HZ 9.19 

Mais dans la plupart de mes cas, je reçois des résultats extrêmement étranges. Donc, ma prochaine pensée était d'utiliser un ajusteur de bundle à part entière (qui devrait faire ce que je cherche?!). Actuellement, ma seule grande dépendance est OpenCV et ils n'ont qu'une implémentation d'ajustement de paquet non documentée.

La question est:

  • Y at-il un dispositif de réglage du faisceau qui n'a pas de dépendances et utilise une licence qui permet l'utilisation du commerce?
  • Existe-t-il un autre moyen facile de trouver les extrinsèques?
  • Les objets ayant des distances très différentes par rapport aux caméras sont-ils un problème? (Lourd parallaxe)

Merci à l'avance

+0

Pouvez-vous fournir plus de détails? Est-ce que, les deux caméras ont un champ de vision commun (FOV)? –

+0

Les caméras sont du même modèle - mais pas identiques - donc les intrinsèques peuvent être légèrement différents. Idéalement, les paramètres intrinsèques sont ajustés aussi, mais ce n'est actuellement pas ma priorité. – Daniel

+0

Ma question était de savoir si les deux caméras ont une zone commune qui peut être imagée. Si oui, vous pouvez placer un échiquier dans cette zone commune et trouver la pose relative entre les caméras. –

Répondre

1

Je travaille aussi sur la même problème et faire face aux problèmes slimier. Voici quelques suggestions -

  1. Modifier Matrice Essential Avant décomposition: Modifier la matrice essentielle avant la décomposition [UW Vt] = SVD (E), et le nouveau E »= diag (s, s, 0) où s W = (0,0) + W (1,1)/2

  2. 2-étape d'estimation de la matrice fondamentale: recalculer la matrice fondamentale avec les boutonnières RANSAC

Ces étapes devraient rendre la rotation estimation plus sensible au bruit.

+0

hey merci pour votre réponse, pouvez-vous expliquer la première étape avec un peu plus de détails? – Daniel

0

Vous devez obtenir 4 solutions différentes et sélectionner celle avec le plus de # points ayant des coordonnées Z positives. Les solutions sont générées en inversant le signe de la matrice fondamentale et en remplaçant w par w_inv, ce que vous n'avez pas fait en calculant w_inv. Est-ce que vous réutilisez le code de quelqu'un d'autre?

Questions connexes