2017-01-31 5 views
0

Je veux calculer l'étalonnage extrinsèque de deux caméras w.r.t l'autre et je utilise cv :: fonction stereoCalibrate() pour le faire. Cependant, le résultat ne correspond pas à la réalité. Quel pourrait être le problème?calibration multi-caméra avec OpenCV: Deux caméras font face

Configuration: Deux caméras montées 7 mètres de haut, face à face tout en regardant vers le bas. Ils ont beaucoup d'intersection de champ de vision et j'ai capturé des images de damier que j'ai utilisées dans l'étalonnage.

Je ne retourne aucune des images.

Ai-je besoin de retourner les images? ou dois-je faire autre chose pour dire que les caméras se font face?

Note: La même fonction étalonne parfaitement les caméras qui sont à côté de l'autre face dans la même direction (comme une caméra stéréo typique).

Merci

+0

Combien d'images avez-vous utilisé pour l'étalonnage? Ont-ils assez de variations de rotation? – hiroki

+0

J'utilise 50 images avec une rotation correcte et une variation de biais. – user3755683

+0

Ce que je ferais: calibrer chaque caméra indépendamment en utilisant 'cv :: calibrateCamera()'. Estimez la transformation entre les deux cadres de la caméra une fois qu'ils ont été définitivement corrigés: un motif d'échiquier visible pour chaque caméra + 'cv :: solvePnP()'. La transformation 'c1Mc2' peut être estimée comme' c1Mo x (c2Mo)^- 1'. – Catree

Répondre

0

Afin de « dire que les caméras sont en fait face à l'autre » vous devez spécifier correctement imagePoints1 et imagePoints2, tels que les points d'indices correspondant correspondent à un même point physique. Si dans votre cas la fonction fonctionne parfaitement lorsque les caméras sont orientées dans la même direction et ne fonctionne pas avec votre configuration - une divergence entre l'indexation des points peut être une raison probable (les points les plus probables sont inversés verticalement et horizontalement).

Une façon de déboguer est de tirer des indices soit près des points sur chacun des cadres, ou code couleur les et assurez-vous qu'ils correspondent entre les images.

Une question bien - pourquoi utilisez-vous cv::stereoCalibrate()? Le paramètre que vous avez décrit ne semble pas être un bon cas d'utilisation. Si vous voulez estimer les paramètres extrinsèques des caméras, vous pouvez utiliser cv::calibrateCamera(). Le seul inconvénient est qu'il suppose que les paramètres intrinsèques sont les mêmes pour toutes les vues fournies (toutes les images ont été prises avec des caméras identiques ou très similaires). Si ce n'est pas le cas - en effet cv::stereoCalibrate() serait un meilleur ajustement (mais le manuel suggère que vous estimez toujours les paramètres intrinsèques de chaque caméra individuellement en utilisant cv::calibrateCamera())

+0

J'ai vérifié les points et les correspondances des points semblent bonnes. Cela ne suggère pas le besoin de retourner. Je voudrais trouver la rotation et la traduction entre la première et la seconde caméra qui est fournie par 'cv :: stereoCalibrate()'. Et oui j'utilise 'cv :: calibrateCamera()' pour calibrer les caméras individuelles et je fournis les matrices de caméra à 'cv :: stereoCalibrate()'. Comment proposez-vous que j'utilise les résultats de 'cv :: calibrateCamera()' pour trouver la transformation entre les caméras? – user3755683

+0

Tout à fait selon le doc - 'objectPoints' sera un vecteur de vecteurs de coordonnées point 3d du marqueur,' imagePoints' sera un vecteur de vecteurs de coordonnées point 2d détectées, 'rvecs' et' tvecs' contiendront des extrinsics par chaque vue (rotation et translation). Si vous le pouvez - veuillez fournir des échantillons d'images avec les correspondances montrées - cela aidera à éclaircir les choses. – alexisrozhkov