OpenCV:求解PnP tvec单位和轴方向



我正在尝试找到相机与棋盘的相对位置(或相反( - 我觉得可以在不同的坐标系之间进行转换,例如此处建议的那样。我决定在这个阶段不仅使用棋盘进行校准,还使用实际位置确定,因为我可以使用findChessboardCorners来获取imagePoints(这工作正常(。

我已经阅读了很多关于这个主题的文章,并且觉得我理解solvePnP输出(尽管我对openCV和计算机视觉完全陌生(。不幸的是,我从solvePnP和物理测量测试设置中得到的结果是不同的:z方向的平移偏差了大约25%。 xy方向是完全错误的 - 几个数量级和不同的方向与我所读到的相机坐标系(x指向图像,y指向右侧,z远离相机(。如果我在世界坐标中将tvecrvec转换为相机姿势,差异仍然存在。

我的问题是:

  • 照相机和世界坐标系轴的方向是什么?
  • solvePnP是否以与我指定objectPoints相同的单位输出翻译?
  • 我将世界原产地指定为objectPoints中的第一个(棋盘角之一(。可以吗,是否tvec从相机坐标到该点的平移?

这是我的代码(我附它的形式,因为它不会引发任何异常等(。我在校准期间使用灰度图像来获取相机固有矩阵和失真系数,因此决定也执行灰度定位。 chessCoordinates 是棋盘点相对于原点(角点之一(的位置列表(以毫米为单位(。 camMatrixdistCoefficients来自校准(使用相同的棋盘和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)

相机坐标与图像坐标相同。因此,您有 x 轴指向相机右侧,y 轴指向下方,z 指向相机面向的方向。这是一个顺时针斧系统,同样适用于棋盘,所以如果你在棋盘的右上角指定原点,x斧头沿着棋盘的较长一侧向右移动,y沿着棋盘的较短一侧,z斧将指向向下,指向地面。

求解 PnP 以与指定棋盘字段长度的单位相同的单位输出转换,但它也可能使用相机校准中指定的单位,因为它使用相机矩阵。

Tvec 指向放置校准对象的世界坐标的原点。因此,如果您将第一个对象点放在 (0,0( 中,则 tvec 将指向该位置。

照相机和世界坐标系轴的方向是什么?

板上的 0,0,0 角使 X 和 Y 轴朝向其余角点。Z 轴始终指向远离电路板的位置。这意味着它通常指向相机的方向。

solvePnP 是否以与我指定对象点相同的单位输出转换?

是的

我将世界原点指定为对象点(棋盘角之一(的第一个。可以吗,tvec 是否从相机坐标精确地平移到那个点?

是的,这很常见。在大多数情况下,第一个凸轮角设置为 0,0,0,随后的角设置为 z=0 平面(例如;(1,0,0( 、(0,1,0( 等(。

TVEC 与旋转相结合,从电路板坐标框指向该点朝向摄像机。总之;TVEC和RVEC为您提供反向平移(世界->相机(。使用一些基本的几何图形,您可以计算将相机>世界的变换。

相关内容

  • 没有找到相关文章

最新更新