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为单位,相对于原点(角点之一).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)
Run Code Online (Sandbox Code Playgroud)
mor*_*icz 10
相机坐标与图像坐标相同.所以你有x ax指向相机的右侧,y ax指向下方,z指向相机所面对的方向.这是一个顺时针斧系统,同样适用于棋盘,所以如果你指定原点,比如棋盘的右上角,x轴沿着较长的一侧向右,y沿着较短的一侧.棋盘,z ax将向下指向地面.
求解PnP以与您指定棋盘字段长度的单位相同的单位输出平移,但它也可能使用相机校准中指定的单位,因为它使用相机矩阵.
Tvec指向您放置校准对象的世界坐标的原点.因此,如果您将第一个对象点放在(0,0)中,那就是tvec指向的位置.