2017-01-17 4 views
1

J'ai vraiment du mal à comprendre ce truc, je ne suis qu'un débutant en python, et je ne trouve pas d'explication à ce code.Python OpenCV Stereo Étalonner les points de l'objet

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) 
objp = np.zeros((6*9,3), np.float32) 
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2) 

l'original est que, la figure 9 est 7. Je suppose que 9 et 6 sont les angles intérieurs des colonnes et des lignes du motif en damier, respectivement. (donc mon échiquier est vraiment 10x7)

Maintenant, je connais la taille du carré sur l'échiquier, ce que je ne peux pas comprendre c'est où le mettre là.

Comme chaque itération sur chaque image, le code que je trouve juste le faire:

objpoints.append(objp) 

Et je peux voir, il est toujours pousser encore et encore le même objet.

Deux questions: comment objpoints.append(objp) à chaque itération fait une différence?

comment puis-je spécifier dans le code, la taille du carré? où devrais-je le mettre?

Je sais que les points d'objets sont les points 3d de chaque carré dans l'échiquier, c'est pourquoi je suis très confus, il n'est même pas manipulé à chaque itération.

Merci!

EDIT: Mon code pour stereocalib: http://pastebin.com/pw5n3pme

(Il est juste une version modifiée de l'étalonnage individuel de la caméra)

+0

Vous devez lier le code entier, si vous voulez une réponse complète et comprendre ce qu'il fait. Je vais essayer de répondre quand même. – marcoresk

Répondre

1

Je suppose que vous travaillez avec this code ou similaire.

Première question

comment n'objpoints.append (objp) à chaque itération faire une différence? Ce n'est pas le cas. De la ligne que vous avez publié, regardez ce

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2) 

Ici, il calcule la disposition des coins, qui échiquiers, dans un certain jeu d'échecs, sont toujours les mêmes. Chaque itération vous trouvez différents imgpoints dans votre appareil photo pour les mêmes points dans l'échiquier.

Si l'étaient pas les mêmes points, vous ne pouvez effectuer l'étalonnage

Deuxième question

comment puis-je spécifier dans le code, la taille carrée? où devrais-je le mettre?

dans le tutoriel que j'ai posté, pour Python et OpenCV, vous ne devez pas spécifier la taille carrée. Il est mono-calibrage, donc la taille carrée est liée uniquement au facteur d'échelle, (tout à fait) inutile en mono caméra. Vous obtiendrez une matrice de caméra correcte avec un facteur d'échelle indéfini (ou peut-être égal à 1).

Si vous avez un code différent (par exemple un calibrage stéréo), postez-le et j'essaierai de trouver où la cote doit être placée.

+0

merci pour @marcoresk réponse est ici la pastebin de mon stereocalib.py http://pastebin.com/pw5n3pme il , je l'ai utilisé les matrices calibrées individuellement pour les caméras gauche et droite. cela a fonctionné pour moi plutôt que de calibrer les deux caméras en même temps. – Wreigh

+0

dans le stereocalib, je viens de copier le code que vous avez lié, et l'a fait pour les deux caméras à la fois et juste utilisé la méthode stereoCalibrate au lieu de la cameraalibrate – Wreigh

+0

@WreighChristianSantos ce code était seulement un tutoriel. Pour insérer la taille des carrés, vous devez l'utiliser avec objp. Lire [cette autre réponse] (http://stackoverflow.com/questions/37310210/camera-calibration-with-opencv-how-to-adjust-chessboard-square-size) – marcoresk

1

Je fais également l'étalonnage de la caméra stéréo en Python et OpenCV et je connais la réponse à votre deuxième question (la réponse est déjà la première).

comment puis-je spécifier dans le code, la taille du carré? où devrais-je le mettre?

Ici, si la taille de votre carré est de 30 mm, multipliez cette valeur par objp[:,:2]. Comme cette

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)*30 # 30 mm size of square 

Comme objp[:,:2] est un ensemble de points de coins checkboard donnés en (0,0), (0,1), (0,2) .... (8,5). (0,0) le point est le coin supérieur gauche du carré le plus haut et (8,5) le coin inférieur droit le plus bas. Dans ce cas, ces points n'ont pas d'unité mais si on multiplie ces valeurs par la taille carrée (par exemple 30 mm), alors elles deviendront (0,0), (0,30), ..... (240,150) sont les unités du monde réel. Votre vecteur de traduction sera en unités mm dans ce cas.