【发布时间】:2013-06-29 16:27:28
【问题描述】:
我正在尝试找到相机与棋盘的相对位置(或相反) - 我觉得可以在不同坐标系之间进行转换,例如正如建议的here。我决定在这个阶段不仅使用棋盘进行校准,还使用实际位置确定,因为我可以使用findChessboardCorners 来获得imagePoints(这工作正常)。
我已经阅读了很多关于这个主题的内容,并且觉得我理解 solvePnP 的输出(尽管我对 openCV 和一般的计算机视觉完全陌生)。不幸的是,我从solvePnP 得到的结果和物理测量测试设置是不同的:z 方向的平移大约偏离了。 25%。 x 和 y 方向完全错误 - 与我读到的相机坐标系相比,几个数量级和不同的方向(x 指向图像,y 指向右侧,z 远离相机)。如果我将 tvec 和 rvec 转换为世界坐标中的相机姿势,差异仍然存在。
我的问题是:
- 相机和世界坐标系轴的方向是什么?
-
solvePnP是否以与我指定objectPoints相同的单位输出翻译? - 我将世界原点指定为
objectPoints(棋盘角之一)中的第一个。可以吗?tvec是从相机坐标精确到该点的转换吗?
这是我的代码(我附上它pro forma,因为它不会引发任何异常等)。我在校准过程中使用灰度图像来获取相机内在矩阵和失真系数,因此决定也执行灰度定位。 chessCoordinates 是相对于原点(角点之一)以毫米为单位的棋盘点位置列表。 camMatrix 和 distCoefficients 来自校准(使用相同的棋盘和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