OpenCV: solvePnP unités tvec et axes directions

j'essaie de trouver la position relative de la caméra par rapport à l'échiquier (ou l'inverse) - je me sens D'accord avec la conversion entre différents systèmes de coordonnées, par exemple comme suggéré ici . J'ai décidé d'utiliser l'échiquier non seulement pour le calibrage, mais aussi pour la détermination de la position réelle à ce stade, puisque je peux utiliser le findChessboardCorners pour obtenir le imagePoints (et cela fonctionne bien).

j'ai beaucoup lu sur ce sujet et je sens que je comprendre les sorties solvePnP (même si je suis complètement nouveau à openCV et la vision informatique en général). Malheureusement, les résultats que j'obtiens de solvePnP et la mesure physique de la configuration du test sont différents: la traduction en z-direction est désactivée d'environ. 25%. x et y directions sont complètement fausses - plusieurs ordres de grandeur et de direction différente de ce que j'ai lu pour être le système de coordonnées de la caméra (x pointant vers le haut de l'image, y vers la droite, z loin à partir de l'appareil photo). La différence persiste si je convertis tvec et rvec à la pose de caméra en coordonnées mondiales.

mes questions sont:

  • quelles sont les directions des axes de la caméra et des systèmes de coordonnées mondiales?
  • est-ce que solvePnP produit la traduction dans les mêmes unités que je spécifie le objectPoints ?
  • j'ai précisé l'origine du monde, comme le premier des objectPoints (l'un des coins de l'échiquier). Est-ce correct et est-ce que tvec est la traduction exacte à partir des coordonnées de la caméra?

C'est mon code (je le joins pro forma car il ne jette aucune exception, etc.). J'ai utilisé des images en échelle de gris pour obtenir la matrice intrinsèque de la caméra et les coefficients de distorsion pendant le calibrage, donc j'ai décidé d'effectuer la localisation en échelle de gris aussi bien. chessCoordinates est une liste de points d'échiquier emplacement en mm par rapport à l'origine (l'un des points d'inflexion). camMatrix et distCoefficients proviennent de l'étalonnage (effectué en utilisant le même échiquier et objectPoints ).

camCapture=cv2.VideoCapture(0) # Take a picture of the target to get the imagePoints 
tempImg=camCapture.read()
imgPts=[]
tgtPts=[]

tempImg=cv2.cvtColor(tempImg[1], cv2.COLOR_BGR2GRAY)
found_all, corners = cv2.findChessboardCorners(tempImg, chessboardDim )

imgPts.append(corners.reshape(-1, 2))
tgtPts.append(np.array(chessCoordinates, dtype=np.float32))

retval,myRvec,myTvec=cv2.solvePnP(objectPoints=np.array(tgtPts), imagePoints=np.array(imgPts), cameraMatrix=camMatrix, distCoeffs=distCoefficients)
5
demandé sur Community 2013-07-02 14:32:50

2 réponses

les coordonnées de la caméra sont les mêmes que celles de l'image. Donc vous avez la hache x pointant du côté droit de la caméra, la hache y pointant vers le bas, et la hache z pointant dans la direction où la caméra est face. C'est un système de hache dans le sens des aiguilles d'une montre, et la même chose s'appliquerait à l'échiquier, donc si vous avez spécifié l'origine, disons, coin supérieur droit de l'échiquier, hache X va le long du côté plus long à la droite et y le long du côté plus court de l'échiquier, hache z serait dirigée vers le bas, à terrain.

résolve PnP produit la traduction dans les mêmes unités que les unités dans lesquelles vous avez spécifié la longueur des champs de l'échiquier, mais il peut également utiliser des unités spécifiées dans l'étalonnage de la caméra, car il utilise la matrice de la caméra.

Tvec indique l'origine des coordonnées du monde dans lequel vous avez placé l'objet de calibrage. Donc si vous avez placé le premier point de l'objet dans (0,0), c'est là que tvec pointera.

10
répondu morynicz 2016-12-17 14:43:10

quelles sont les directions des axes de la caméra et des systèmes de coordonnées mondiales?

le coin 0,0 sur les planches est tel que L'axe X & Y est orienté vers le reste des points d'angle. L'axe Z est toujours dirigé vers l'extérieur. Cela signifie qu'il pointe habituellement un peu dans la direction de la caméra.

est-ce que solvePnP produit la traduction dans les mêmes unités que je spécifie les objectPoints?

Oui

j'ai spécifié l'origine mondiale comme étant le premier des points de l'objet (un des coins de la planche). Est-ce que c'est OK et tvec est la traduction vers exactement ce point des coordonnées de la caméra?

Oui, c'est assez commun. Dans la plupart des cas, le premier coin de came est réglé à 0,0,0 et les coins suivants sont réglés sur le plan z=0 (par exemple: (1,0,0) , (0,1,0), etc.).

le tvec, combiné avec la rotation, pointe vers ce point à partir du cadre de coordonnées de la planche vers la caméra. Bref, le tvec & rvec vous fournit la traduction inverse (world - > camera). Avec un peu de géométrie de base, vous pouvez calculer la transformation qui met caméra -> monde.

3
répondu Nallath 2013-07-02 12:58:03