J'utilise OpenCV et OpenFrameworks (c.-à-d. OpenGL) pour calculer une caméra (matrice de transformation du monde et de projection) d'une image (et plus tard, plusieurs images de triangulation).
Aux fins de l'OPENCV, le " Plan d'étage "devient l'objet (c'est-à-dire l'échiquier) avec 0,0,0 le centre du monde. Les positions du monde / plancher sont connues afin que je dois obtenir les informations de projection (coefficients de distorsion, fov, etc.) et les coordonnées extrinsèques de la caméra. P>
p>
J'ai mappé les positions de vue de ces points de plancher sur mon image 2D dans l'espace de vue normalisé ([0,0 ] est en haut à gauche. [1,1] est en bas à droite). p>
L'objet (plan de plancher / points du monde) est sur un plan XZ, -Y up, donc je convertitons au XY plan (pas Bien sûr, si z-up est négatif ou positif ...) Pour OpenCV, car il doit être planaire p> i passez 1,1 comme l'image sur calibratecamera.
Les drapeaux sont Utilisation de Maintenant pour calculer la transformation de l'espace du monde extrinsèque de la caméra ... Je ne crois pas avoir besoin d'utiliser maintenant j'ai Vous avez une matrice de rotation et de transformation, mais il est majeur de la colonne (je crois que l'objet est totalement asymétrique si je ne transpose pas, et que le code ci-dessus a l'air de colonne majeur pour moi) P> cv_calib_fix_aspect_ratio | v_calib_fix_k4 | cv_calib_fix_k5 code>
calibratecamera code> fonctionne avec succès, me donne une erreur basse (généralement autour de
0,003 code>). p>
CalibrationMatrixValues Code> Je reçois une sensibilité FOV, généralement autour de 50 degrés, donc je suis sûr que les propriétés intrinsèques sont correctes. P>
SolvePnP code> car je n'ai qu'un seul objet (bien que j'ai essayé tout cela avant avec elle et je suis revenu avec les mêmes résultats) P>
ModelView = ModelView.getInverse();
3 Réponses :
La première chose à vérifier est de vérifier que les marqueurs sont reproduits correctement sur l'image indiquée des matrices de caméra intrinsèque et extrinsèque estimées. Ensuite, vous pouvez trouver la position de la caméra dans le cadre global et voir si elle accepte les postes de marqueurs. (Utilisez le système de coordonnées comme dans OpenCV.) Ceci est fait, il n'y a pas beaucoup de choses qui peuvent aller mal. Depuis que vous voulez que des points se trouvent sur l'avion XZ, vous n'avez besoin que d'une seule transformation de coordonnées. Comme je le vois, vous le faites avec la matrice de gworldtocalibration. Appliquez ensuite la transformation des marqueurs et de la position de la caméra et vérifiez que les marqueurs sont au bon endroit. Ensuite, la position de la caméra sera également correcte (à moins que quelque chose n'allait pas mal avec la garantie du système de coordonnées, mais peut être facilement corrigé). P>
Les marqueurs sont reproduits de la caméra en rayons (les lignes bleues) qui sont évidemment au mauvais endroit. Le polygone vert est la projection de rayons à n mètres, et le rouge est où je frappe le plan Y = 0 (Non. Non. Dans ce cas). Mais je suppose que vous voulez dire re-projeté dans l'espace de vue / image, je ferai cela le matin! Et peut aussi convertir tout ce que z = z = enlever une étape ...
Oui, je veux dire la ré-projection sur l'image, immédiatement après l'étalonnage. Cela peut être fait en multipliant des matrices intrinsèques et extrinsées obtenues par les coordonnées des marqueurs (dans le système de coordonnées utilisé pour l'étalonnage).
Mes résultats ne sont pas bons ... Je fais une matrice intrinsèque 4x4 (0,0,0,1 pour le collect / rangée supplémentaire) et copier le reste de la cameramatrix de CalibraTecamera. J'utilise rt code> comme matrice extrinsèque (est-ce correct?) Et multiplie par mes coordonnées normalisées de visualisation d'entrée. Chaque position mondiale ré-projetée est désactivée par une quantité similaire ... (
4.0,1,7,5,5.5 code>,
4.3,1.6,6.0 code>,
4.7, 1.5, 6.0 code>,
4.8,1.6,5.5 code>) Ma traduction extrinsèque est
1.4, 4.3, 6.3 code>. Je ne peux pas m'empêcher de penser que ces valeurs sont liées .... Est-ce que je fais le test de ré-projection juste?
Pour l'instant au moins, je traite mon édition 2 (Imaginiser doit être quelque chose de plus grand que 1,1) que le correctif puisqu'il produit des résultats beaucoup, beaucoup plus comme ce que j'attendais. p>
Je pourrais avoir des choses à l'envers pour le moment, mais cela produise de très bons résultats. P>
salut! J'ai un problème similaire mais .. des édits, ce n'est pas très clair .. à la fin de quelle procédure étape par étape?
La solution au problème était de ne pas normaliser mes coordonnées d'image, donc au lieu de flotter et d'Image 1,1 J'ai utilisé des coordonnées pixels et 1920 1080. Je ne crois pas que je devais changer d'autre chose.
Je pense que vous devriez pas strud> Prendre l'inverse de gworldtocalibration em> Ici, j'ai posté le code, ce qui fait plus ou moins quoi Vous voulez OpenCV- OpenGL COS . C'est en C, mais devrait être similaire à C ++. P> P>
Êtes-vous sûr de visualiser la position de la caméra, mais non du composant traductionnel de la matrice de caméra extrinsèque?
Je ne suis pas sûr que je n'ai pas mal lu votre commentaire, mais la matrice de modèle finaleView (que je pense est / devrait être la CAM POS) est définie sur la transformation globale de l'Ofcamera. La visualisation est la suivante; vert + y, bleu + z, rouge + x.
La grille est galbée autour de 0,0,0. J'ai peut-être pu devenir extrinsèque et la caméra transformer mal? Mais c'est ce que l'invert est pour.
Désolé, j'ai raté l'étape d'inversion. Alors cela semble être ok.