2013-07-22 3 views
4

J'ai une photocaméra montée verticalement sous l'eau dans un réservoir, en regardant vers le bas. Il y a une grille plate au fond du réservoir (à environ 2m de la caméra). Je veux être en mesure de placer des marqueurs sur le fond, et utiliser la vision par ordinateur pour connaître leur position exacte dans la vie réelle. Donc, j'ai besoin de mapper des pixels en mm. Si je ne me trompe pas, cv :: calibrateCamera (...) fait exactement cela, mais cela dépend du déplacement d'un motif devant la caméra. Je n'ai que des images statiques de la scène, et la caméra ne bouge jamais par rapport à la grille. Ainsi, je n'ai qu'une image "unique" pour trouver les paramètres. Comment puis-je faire cela en utilisant la grille?OpenCV - calibrer la caméra en utilisant des images statiques dans l'eau

Merci.

Répondre

1

Pour étalonner la caméra, vous avez besoin de plusieurs images du damier (ou de l'un des autres motifs trouvés here). Ce que vous pouvez faire, c'est calibrer la caméra hors de l'eau ou faire une séquence d'étalonnage une fois.

Une fois que vous avez cette information (distance focale, centre de l'objectif, distorsion, etc.). Vous pouvez utiliser la fonction solvePNP pour estimer l'orientation d'une seule carte. Cette estimation vous donne une distance entre la caméra et le tableau.

Une alternative complètement différente pourrait être de trouver quel type d'objectif l'appareil photo utilise et remplir manuellement les données. Je n'ai pas essayé cela, donc je ne sais pas si ça marcherait.

+0

Oui, c'est quelque chose le long de la deuxième option que j'apprécierais avec de l'aide. Je connais des paramètres tels que la distance par rapport à la cible, la taille en pixels de tous les carrés, la taille du capteur, etc. La longueur focale est ajustable manuellement, et je ne sais pas à quoi cela correspondait, mais je peux le calculer.J'espérais pouvoir calibrer la caméra en fournissant un nombre de points avec une distance connue en mm. puis étalonnez pour cet environnement statique particulier. –

+0

Vous pourriez "force brute" la longueur focale. Essayez plusieurs valeurs et voyez celles qui semblent donner les meilleurs résultats. – Nallath

3

Problème intéressant! La partie "mignonne" est l'effet sur les paramètres intrinsèques de la réfraction à l'interface eau-verre, à savoir augmenter la distance focale (ou, inversement, réduire le champ de vision) par rapport à la même lentille dans l'air. En théorie, vous pouvez calibrer dans l'air et ensuite corriger la différence d'indice de réfraction, mais l'étalonnage directement dans l'eau est susceptible de vous donner des résultats plus précis.

Connaissez-vous vos exigences de précision? Et avez-vous vérifié que votre combinaison objectif/capteur est suffisante pour les respecter (avec une marge suffisante)? Pour répondre à la question, vous devez estimer (soit par calcul à partir des spécifications de l'objectif et du capteur, soit en utilisant expérimentalement un graphique de résolution) si vous pouvez résoudre dans une image les distances minimales requises par votre application.

De la formulation de votre question, je pense que vous êtes intéressé uniquement dans les mesures sur un seul plan. Il vous suffit donc de (a) supprimer la distorsion de lentille non linéaire (en barillet ou en coussinet) et (b) estimer le homography entre le plan d'intérêt et l'image. Une fois que vous avez ce dernier, vous pouvez convertir directement des coordonnées d'image non déformées en coordonnées mondiales par multiplication matricielle. De plus, si (comme j'imagine) le plan d'intérêt est à peu près parallèle au plan de l'image, vous ne devriez avoir aucun problème à garder le champ de vision entier au point. Bien sûr, pour que tout cela fonctionne comme prévu, vous devez vous assurer que le fond du réservoir est vraiment plat, dans les tolérances de mesure de votre application. Sinon, vous êtes vraiment confronté à un problème 3D et devez modifier vos procédures en conséquence.

La procédure actuelle dépend beaucoup de la taille du réservoir, que vous n'indiquez pas clairement. Si c'est assez petit pour qu'il soit pratique de fabriquer une cible de calibrage mobile semblable à un échiquier, il faut absolument y aller. Vous pouvez jeter un oeil à this other answer pour des suggestions. Dans la suite, je vais discuter du cas le plus intéressant dans lequel votre réservoir est grand, par ex. la taille d'une piscine.

Je procéderais en collant des marqueurs d'étalonnage dans une grille régulière au fond de la piscine. Je choisirais probablement des marqueurs ressemblant à des pions comme these, peut-être les imprimer moi-même avec une bonne imprimante laser sur plastique avec un support adhésif (en supposant que vous pouvez les laisser en place pour toujours). Vous devriez prévoir d'en avoir plusieurs, par exemple, une grille de 8x8 ou 10x10, couvrant autant que possible le champ de vision de la caméra dans sa position de fonctionnement et de pose. Pour faciliter l'alignement de la grille, vous pouvez utiliser un projecteur à ligne laser d'un angle de ventilateur approprié, ou un pointeur laser fixé à un support rotatif. Notez bien qu'il n'est pas nécessaire qu'ils soient apposés dans une grille X-Y précise (ce qui peut être compliqué, en fonction de la taille de votre piscine), mais seulement que leurs positions par rapport à des trois choix arbitraires (mais fixes) soient connues. En d'autres termes, vous pouvez les attacher au fond approximativement dans une grille, puis mesurer les distances de trois coins extrêmes les uns des autres aussi précisément que possible, construisant ainsi un triangle de base, puis mesurer les distances de tous les autres coins sommets du triangle, et enfin reconstruire leurs vraies positions avec un peu de trigonométrie. Il s'agit essentiellement d'un problème d'arpentage et, en fonction de vos exigences en matière de précision et de votre budget, vous voudrez peut-être inscrire un arpenteur professionnel amical local (et ses outils) pour le faire aussi précisément que nécessaire. Une fois que vous avez votre grille, vous pouvez remplir la piscine, obtenir votre appareil photo, mettre au point et f-arrêter l'objectif selon les besoins de l'application. A partir de maintenant, vous ne pourrez plus jamais toucher le focus et f-stopper à nouveau, sous peine de malalibration - l'exposition ne peut être contrôlée que par le temps d'exposition, alors assurez-vous d'avoir assez de lumière. Désactivez toutes les fonctions autofocus et auto-iris, le cas échéant. Si l'appareil photo est équipé d'une monture d'objectif non rigide (par exemple un DLSR), vous aurez besoin d'une sorte d'équipement mécanique pour garantir que la paire de lentilles et de corps reste rigide. F-stop aussi près que possible, compte tenu de l'éclairage et du capteur disponibles, afin d'avoir un peu de profondeur de champ disponible. Prenez ensuite plusieurs photos (~ 10) de la grille, en déplaçant et en faisant tourner la caméra, et en vous rapprochant un peu plus de la distance de fonctionnement prévue de l'avion. Vous voudrez "voir" dans certaines images un raccourci significatif de la grille - ceci est nécessaire pour calibrer avec précision la distance focale. Évitez JPG et tout autre format de compression avec perte lors du stockage des images - utilisez le format PNG ou TIFF sans perte.

Une fois que vous avez les images, vous pouvez marquer et identifier manuellement les marqueurs de checker dans les images. Pour un projet ponctuel comme celui-ci, je ne m'embêterais pas avec l'identification automatique, faites-le manuellement (par exemple dans Matlab, ou même dans Photoshop ou Gimp). Pour aider à identifier les marqueurs, vous pouvez, par exemple. imprime un numéro à côté d'eux. Une fois que vous avez les marques manuelles, vous pouvez les affiner automatiquement pour obtenir une précision de sous-pixel, par ex. en utilisant cv :: findCornerSubpix.

Vous avez presque terminé. Alimentez la position mesurée "de référence" des angles réels, et ceux observés dans toutes les images, à votre routine d'étalonnage de caméra préférée, par ex. cv :: calibrateCamera. Vous utilisez la distance focale nominale de la caméra (convertie en pixels) pour une estimation initiale, ainsi qu'une distorsion nulle. Si tout se passe bien, vous obtiendrez les paramètres intrinsèques de la caméra, que vous conserverez, et la caméra posera sur toutes les images que vous jeterez.

Vous pouvez maintenant installer la caméra dans votre configuration finale, selon les besoins de votre application, et prendre une autre image de la grille. Marquez et affinez les positions de coin comme avant. Undistort leurs positions d'image en utilisant les paramètres de distorsion retournés par l'étalonnage. Calculez enfin l'homographie entre les positions de référence des marqueurs réels (en mètres) et leurs positions non déformées, et vous avez terminé.

HTH

+0

Merci pour votre réponse très complète! Je m'excuse de ne pas avoir mentionné toutes les informations pertinentes. Le réservoir est de la taille d'une piscine, en fait si grande que je ne peux pas calibrer et puis le remplir .. Cela prendra des jours. Vous avez raison, les mesures ne sont que 2D (au fond du réservoir qui est plat). Je suis incapable de revenir en arrière et de répéter, donc si je pouvais calibrer en utilisant les images existantes ce serait génial. Ma grille de fond couvre presque tout le champ de vision, et connaissant la taille de la grille, je devrais en quelque sorte être capable de corriger l'image? –

Questions connexes