5

我正在尝试找到相机与棋盘的相对位置(或其他方式) - 我对在不同坐标系之间进行转换感到满意,例如这里所建议的。我决定在这个阶段不仅使用棋盘进行校准,而且还使用实际位置确定,因为我可以使用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)
4

2 回答 2

12

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

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

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

于 2013-07-02T14:45:56.727 回答
3

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

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

solvePnP 是否以与我指定 objectPoints 相同的单位输出翻译?

是的

我将世界原点指定为第一个 objectPoints(棋盘角之一)。可以吗? tvec 是否可以从相机坐标准确地转换到该点?

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

tvec 与旋转相结合,从板坐标系指向相机的那个点。简而言之; tvec & rvec 为您提供逆向翻译(世界 -> 相机)。使用一些基本几何图形,您可以计算将相机 -> 世界放置的转换。

于 2013-07-02T12:58:03.573 回答