Je suis totalement nouveau dans les techniques d'étalonnage des caméras ... J'utilise la technique des échiquiers OpenCV ... J'utilise une webcam de Quantum ...
Voici mes observations et étapes ..
Je suis le code C dans Learning OpenCV par Bradski pour l'étalonnage. mon code d'étalonnage est
cvCalibrateCamera2(object_points,image_points,point_counts,cvSize(640,480),intrinsic_matrix,distortion_coeffs,NULL,NULL,CV_CALIB_FIX_ASPECT_RATIO);
Avant d'appeler cette fonction, je fais le premier et le deuxième élément le long de la diagonale de la matrice intrinsèque comme l'un pour maintenir le rapport des longueurs focales constant et en utilisant CV_CALIB_FIX_ASPECT_RATIO
Avec le changement de distance de l'échiquier, les fx
et fy
changent avec fx:fy
presque égal à 1. il existe des valeurs cx
et cy
de 200 à 400. les fx
et fy
sont de l'ordre de 300 - 700 quand je change la distance.
Actuellement, j'ai mis tous les coefficients de distorsion à zéro car je n'ai pas obtenu de bons résultats, y compris les coefficients de distorsion. Mon image originale avait l'air plus belle que celle non déformée !!
Suis-je en train d'étalonner correctement?. Dois-je utiliser une autre option que CV_CALIB_FIX_ASPECT_RATIO
?. Si oui, lequel?
Hmm, cherchez-vous "beau" ou "précis"?
L'étalonnage des caméras est l'un des très rares sujets en vision par ordinateur où la précision peut être directement quantifiée en termes physiques et vérifiée par une expérience physique. Et la leçon habituelle est que (a) vos chiffres sont tout aussi bons que l'effort (et l'argent) que vous y mettez, et (b) la précision réelle (par opposition à l'imagination) coûte cher, vous devez donc comprendre à l'avance ce que votre application demande vraiment de la précision.
Si vous recherchez les spécifications géométriques de combinaisons d'objectifs/capteurs même très bon marché (dans la plage de mégapixels et plus), il devient évident que la précision d'étalonnage sous-sous-mm est théoriquement réalisable dans un volume d'espace de table. Déterminez simplement (à partir de la feuille de spécifications du capteur de votre appareil photo) l'angle solide sur un pixel - vous serez ébloui par la résolution spatiale que vous avez à portée de votre portefeuille. Cependant, la réalisation RÉPÉTABLE de quelque chose proche de cette précision théorique demande du travail.
Voici quelques recommandations (issues de votre expérience personnelle) pour obtenir une bonne expérience d'étalonnage avec un équipement maison.
Si votre méthode utilise une cible plate ("damier" ou similaire), fabriquez-en une bonne. Choisissez un support très plat (pour la taille que vous mentionnez, le verre à vitre de 5 mm d'épaisseur ou plus est excellent, bien que manifestement fragile). Vérifiez sa planéité par rapport à un autre Edge (ou, mieux, à un faisceau laser). Imprimez le motif sur du papier épais qui ne s'étirera pas trop facilement. Posez-le après impression sur le support avant le collage et vérifiez que les côtés carrés sont bien quasi orthogonaux. Les imprimantes à jet d'encre ou laser bon marché ne sont pas conçues pour une précision géométrique rigoureuse, ne leur faites pas confiance aveuglément. La meilleure pratique est d'utiliser un imprimeur professionnel (même un Kinko fera un bien meilleur travail que la plupart des imprimantes à domicile). Ensuite, fixez le motif très soigneusement sur le support, en utilisant de la colle en spray et en essuyant lentement avec un chiffon doux pour éviter les bulles et les étirements. Attendez un jour ou plus pour que la colle sèche et que le stress du papier colle atteigne son état stable à long terme. Enfin mesurez les positions des coins avec un bon pied à coulisse et une loupe. Vous pouvez vous en tirer avec un seul numéro pour la taille carrée "moyenne", mais il doit s'agir d'une moyenne des mesures réelles, pas des espoirs-n-prières. La meilleure pratique consiste à utiliser un tableau des positions mesurées.
Surveillez les changements de température et d'humidité: le papier adsorbe l'eau de l'air, le support se dilate et se contracte. Il est étonnant de voir combien d'articles que vous pouvez trouver qui rapportent des précisions d'étalonnage inférieures au millimètre sans citer les conditions de l'environnement (ou la réponse cible à celles-ci). Inutile de dire que ce sont surtout des conneries. Le coefficient de dilatation à plus basse température du verre par rapport à la tôle courante est une autre raison pour préférer le premier comme support.
Inutile de dire que vous devez désactiver la fonction de mise au point automatique de votre appareil photo, si elle en a un: la mise au point déplace physiquement un ou plusieurs morceaux de verre à l'intérieur de votre l'objectif, changeant ainsi (légèrement) le champ de vision et (généralement par beaucoup) la distorsion de l'objectif et le point principal.
Placez l'appareil photo sur un support stable qui ne vibre pas facilement. Faites la mise au point (et arrêtez l'objectif si elle a un iris) comme cela est nécessaire pour l'application (pas l'étalonnage - la procédure d'étalonnage et la cible doivent être conçues pour les besoins de l'application, et non l'inverse). Ne pensez même pas à toucher l'appareil photo ou l'objectif par la suite. Si possible, évitez les lentilles "complexes" - par ex. zooms ou très grand angle. Les lentilles fisheye ou anamorphiques nécessitent des modèles beaucoup plus complexes que ce qu'OpenCV propose en stock.
Prenez beaucoup de mesures et de photos. Vous voulez des centaines de mesures (coins) par image et des dizaines d'images. En matière de données, plus on est de fous. Un damier 10x10 est le minimum absolu que je considérerais. Je travaillais normalement à 20x20.
Span le volume d'étalonnage lors de la prise de photos. Idéalement, vous souhaitez que vos mesures soient uniformément réparties dans le volume d'espace avec lequel vous travaillez. Plus important encore, assurez-vous de incliner la cible de manière significative par rapport à l'axe focal sur certaines images - pour calibrer la distance focale dont vous avez besoin pour "voir" un raccourcissement réel de la perspective. Pour de meilleurs résultats, utilisez un gabarit mécanique répétable pour déplacer la cible. Une bonne est une plaque tournante à un axe, qui vous donnera un excellent modèle antérieur pour le mouvement de la cible.
Minimisez les vibrations et le flou de mouvement associé lors de la prise de photos.
Utilisez un bon éclairage. Vraiment. C'est incroyable la fréquence à laquelle je vois des gens se rendre compte tard dans le jeu que vous avez besoin de photons pour calibrer n'importe quelle caméra :-) Utilisez un éclairage ambiant diffus et faites-le rebondir sur des cartes blanches des deux côtés du champ de vision.
Regardez ce que fait votre code d'extraction de coin. Dessinez les positions de coins détectées au-dessus des images (dans Matlab ou Octave, par exemple) et jugez leur qualité. Il est préférable de supprimer les valeurs aberrantes tôt en utilisant des seuils serrés que de faire confiance au robustificateur dans votre code d'ajustement de bundle.
Limitez votre modèle si vous le pouvez. Par exemple, n'essayez pas d'estimer le point principal si vous n'avez pas de bonnes raisons de croire que votre objectif est nettement décentré par rapport à l'image, fixez-le simplement au centre de l'image lors de votre première tentative. L'emplacement du point principal est généralement mal observé, car il est intrinsèquement confondu avec le centre de la distorsion non linéaire et par le composant parallèle au plan image de la translation de la cible à la caméra. Pour bien faire les choses, il faut une procédure soigneusement conçue qui génère au moins trois points de fuite indépendants de la scène et un très bon bracketing de la distorsion non linéaire. De même, à moins que vous n'ayez des raisons de soupçonner que l'axe focal de l'objectif est vraiment incliné par rapport au poids total. le plan du capteur, fixez à zéro la composante (1,2) de la matrice de la caméra. D'une manière générale, utilisez le modèle le plus simple qui satisfait vos mesures et les besoins de votre application (c'est le rasoir d'Ockam pour vous).
Lorsque vous avez une solution d'étalonnage de votre optimiseur avec suffisamment faible RMS (quelques dixièmes de pixel, généralement, voir également la réponse de Josh ci-dessous)), tracez le modèle XY des erreurs résiduelles (preded_xy - mesurée_xy pour chaque coin de toutes les images) et voir s'il s'agit d'un nuage rond centré sur (0, 0). Des "amas" de valeurs aberrantes ou la non-rondeur du nuage de résidus crient l'alarme sonne que quelque chose ne va pas - des valeurs aberrantes probables en raison d'une mauvaise détection de coin ou d'un mauvais appariement, ou d'un modèle de distorsion d'objectif inapproprié.
Prenez des images supplémentaires pour vérifier la précision de la solution - utilisez-les pour vérifier que la distorsion de l'objectif est effectivement supprimée et que l'homographie planaire prédite par le modèle calibré correspond en fait à celle récupérée à partir des coins mesurés.
C'est une réponse assez tardive, mais pour les personnes qui viennent de Google:
La bonne façon de vérifier la précision de l'étalonnage est d'utiliser l'erreur de reprojection fournie par OpenCV . Je ne sais pas pourquoi cela n'a été mentionné nulle part dans la réponse ou les commentaires, vous n'avez pas besoin de le calculer à la main - c'est la valeur de retour de calibrateCamera
. En Python c'est la première valeur de retour (suivie par la matrice de la caméra, etc.).
L'erreur de reprojection est l'erreur RMS entre l'endroit où les points seraient projetés à l'aide des coefficients intrinsèques et l'endroit où ils se trouvent dans l'image réelle. En règle générale, vous devez vous attendre à un RMS erreur de moins de 0,5 px - Je peux régulièrement obtenir environ 0,1 px avec des caméras de vision industrielle. L'erreur de reprojection est utilisée dans de nombreux papiers de vision par ordinateur, il n'est pas un moyen beaucoup plus facile ou plus précis de déterminer la qualité de votre étalonnage.
Sauf si vous avez un système stéréo, vous ne pouvez déterminer où quelque chose se trouve dans l'espace 3D jusqu'à un rayon, plutôt qu'un point. Cependant, comme on peut déterminer la pose de chaque image d'étalonnage planaire, il est possible de déterminer où chaque coin de l'échiquier doit tomber sur le capteur d'image. Le processus d'étalonnage (plus ou moins) tente de déterminer où ces rayons tombent et minimise l'erreur sur toutes les différentes images d'étalonnage. Dans l'article original de Zhang et les évaluations ultérieures, environ 10 à 15 images semblent être suffisantes; à ce stade, l'erreur ne diminue pas de manière significative avec l'ajout de plus d'images.
D'autres progiciels comme Matlab vous donneront des estimations d'erreur pour chaque élément intrinsèque, par exemple distance focale, centre de projection. Je n'ai pas pu faire en sorte qu'OpenCV recrache ces informations, mais peut-être qu'elles se trouvent quelque part. L'étalonnage de la caméra est désormais natif dans Matlab 2014a, mais vous pouvez toujours vous procurer la boîte à outils d'étalonnage de la caméra qui est extrêmement populaire auprès des utilisateurs de vision par ordinateur.
http://www.vision.caltech.edu/bouguetj/calib_doc/
Une inspection visuelle est nécessaire, mais pas suffisante pour traiter vos résultats. La chose la plus simple à rechercher est que les lignes droites du monde deviennent droites dans vos images non déformées . Au-delà de cela, il est impossible d'être vraiment sûr si vos caméras sont bien calibrées simplement en regardant les images de sortie.
La routine fournie par Francesco est bonne, suivez-la. J'utilise une planche d'étagère comme avion, avec le motif imprimé sur du papier affiche. Assurez-vous que les images sont bien exposées - évitez la réflexion spéculaire! J'utilise un motif standard 8x6, j'ai essayé des motifs plus denses mais je n'ai pas vu une telle amélioration de la précision que cela fait une différence.
Je pense que cette réponse devrait être suffisante pour la plupart des gens qui souhaitent calibrer une caméra - de manière réaliste, sauf si vous essayez de calibrer quelque chose d'exotique comme un Fisheye ou si vous le faites pour des raisons éducatives, OpenCV/Matlab est tout ce dont vous avez besoin. La méthode de Zhang est jugée suffisamment bonne pour que pratiquement tout le monde dans la recherche sur la vision par ordinateur l'utilise, et la plupart d'entre eux utilisent la boîte à outils de Bouguet ou OpenCV.