OpenCV: 解决 solvePnP 中 tvec 的单位和轴方向

6

我正在尝试找到相机相对于棋盘的位置(或者反过来)- 我觉得在不同坐标系之间转换没问题,例如建议在这里。我决定在此阶段不仅用棋盘进行校准,而且还要确定实际位置,因为我可以使用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)
2个回答

15

相机坐标与图像坐标相同。因此,您有指向相机右侧的x轴,指向下方的y轴,以及指向相机面向的方向的z轴。这是一个顺时针轴系统,并且同样适用于棋盘,因此,如果您在棋盘的右上角指定了原点,x轴沿着更长的一边向右延伸,y轴沿着更短的一边延伸,z轴将向下指向地面。

Solve PnP使用与您指定棋盘格场的长度单位相同的单位输出平移结果,但它可能还会使用在相机校准中指定的单位,因为它使用相机矩阵。

Tvec指向您放置校准物体的世界坐标原点。因此,如果您将第一个物体点放在(0,0)处,则tvec将指向该点。


非常好的答案,非常感谢。我之前在某个地方遇到过一些这样的东西,但是得到一些确认还是很好的。此外,坐标系轴的解释非常有用,因为我之前没有遇到过这样的东西。干杯。 - Aleksander Lidtke
@morynicz 不小心点了踩这个好答案,现在我的投票被锁定了:( 显然,你需要编辑才能让我撤销… - Commodore Yournero

4

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

棋盘上的0,0,0点是为了使X和Y轴指向其余角点。Z轴始终指向远离棋盘的方向。这意味着它通常指向相机的方向。

solvePnP是否以我指定的objectPoints单位输出平移?

是的。

我将世界原点指定为objectPoints的第一个点(棋盘角落之一),这样做可以吗?tvec是从相机坐标到该点的精确平移吗?

是的,这很常见。在大多数情况下,第一个相机角落被设置为0,0,0,随后的角落被设置在z=0平面上(例如:(1,0,0)、(0,1,0)等)。

tvec与旋转结合起来,从板坐标系指向相机,指向该点。简而言之,tvec和rvec为您提供反向平移(世界->相机)。通过一些基本几何运算,您可以计算出将相机->世界的变换。


非常感谢您的快速回复。相机坐标系轴指向哪里?“tvec与旋转结合起来,从平面坐标系指向相机拍摄的那个点。”根据这里,tvec是相对于相机的坐标系(而不是朝着相机)。这是你的意思吗? - Aleksander Lidtke
我认为(但我不完全确定)相机坐标系Z轴指向远离相机(朝着它“看”的方向)。我的意思是,世界坐标系和相机坐标系之间存在差异。您可以使用rvec和tvec将在“板框架”中的点转换为“相机框架”。如果要将点从相机框架转换为世界框架,则需要使用两者的逆。 - Nallath
谢谢,我已经在上面的答案和你的帮助下解决了这个问题。现在一切都变得非常清晰明了。干杯! - Aleksander Lidtke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接