OpenCV:solvePnP tvec单位和轴方向

Ale*_*tke 5 python opencv coordinate-systems camera-calibration

我试图找到相机相对于棋盘的相对位置(或者相反的方向) - 我觉得在不同的坐标系之间进行转换是合适的,例如这里建议的.我决定在这个阶段使用棋盘不仅用于校准而且还用于实际位置确定,因为我可以使用它findChessboardCorners来获得imagePoints(并且这可以正常工作).

我已经阅读了很多关于这个主题的内容,并且觉得我理解了solvePnP输出(即使我是openCV一般的新手和计算机视觉).不幸的是,我得到的结果solvePnP和物理测量测试设置的结果是不同的:z方向的平移偏差大约.25%.x并且y方向是完全错误的 - 几个数量级和不同的方向比我读到的相机坐标系统(x指向图像,y向右,z远离相机).所不同的坚持,如果我转换tvec,并rvec以相机姿态在世界坐标.

我的问题是:

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

这是我的代码(我附加备考,因为它不会抛出任何异常等).我使用灰度图像来获取校准期间的相机内在矩阵和失真系数,因此决定以灰度级执行本地化.chessCoordinates是一个棋盘点位置列表,以mm为单位,相对于原点(角点之一).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)
Run Code Online (Sandbox Code Playgroud)

mor*_*icz 10

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

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

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