【问题标题】:OpenCV: solvePnP tvec units and axes directionsOpenCV:solvePnP tvec 单位和轴方向
【发布时间】:2013-06-29 16:27:28
【问题描述】:

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

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

我的问题是:

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

这是我的代码(我附上它pro forma,因为它不会引发任何异常等)。我在校准过程中使用灰度图像来获取相机内在矩阵和失真系数,因此决定也执行灰度定位。 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)

【问题讨论】:

    标签: python opencv coordinate-systems camera-calibration


    【解决方案1】:

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

    板上的 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 与旋转相结合,指向从棋盘坐标系朝向相机的那个点。”根据this tvec 在相机坐标中(而不是“朝向相机”)。是这个意思吗?
    • 我认为(但我不完全确定)相机坐标系 Z 指向远离相机(在它“看”的方向)。我的意思是世界坐标系和相机坐标系之间存在差异。您可以使用 rvec & tvec 将“板框”中的点转换为“相机框”。如果要将相机坐标系中的一个点转换为世界坐标系,则需要使用两者的倒数。
    • 谢谢,在上述答案和您的答案的帮助下,我已经解决了这个问题。现在这一切都很有意义。干杯。
    【解决方案2】:

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

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

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

    【讨论】:

    • 很好的答案,非常感谢。我以前在某个地方遇到过一些这样的东西,但得到一些保证是件好事。此外,坐标系统轴的解释非常有用,因为我没有遇到过这样的事情。干杯。
    • @morynicz 不小心否决了这个好答案,现在我的投票被锁定了 :( 显然你需要编辑它才能让我撤消...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多