gpt4 book ai didi

python - OpenCV:解决PnP tvec单位和轴方向

转载 作者:太空狗 更新时间:2023-10-30 00:30:00 44 4
gpt4 key购买 nike

我正在尝试找到相机相对于棋盘的相对位置(或相反)——我觉得可以在不同的坐标系之间进行转换,例如按照建议here .我决定在这个阶段不仅将棋盘用于校准,而且还用于确定实际位置,因为我可以使用 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)

最佳答案

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

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

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

关于python - OpenCV:解决PnP tvec单位和轴方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17423302/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com