使用OpenCV Python计算摄像机世界位置



我想计算我的相机在世界坐标中的位置。这应该是相当容易的,但我没有得到我期望的结果。我相信我已经阅读了关于这个主题的所有内容,但是我的代码不起作用。我是这样做的:

我有一个相机在看一个区域。

我画了一张该地区的地图。

2)我通过使用cv2.getPerspectiveTransform

将4个图像点与我的地图上的4个点匹配来计算单应性

3) H单应性将每个世界坐标转换为相机坐标;运行正常

4)为了计算相机矩阵,我遵循以下步骤:

translation = np.zeros((3,1)) 
translation[:,0] = homography[:,2]
rotation = np.zeros((3,3))
rotation[:,0] = homography[:,0]
rotation[:,1] = homography[:,1]
rotation[:,2] = np.cross(homography[0:3,0],homography[0:3,1])
cameraMatrix = np.zeros((3,4))
cameraMatrix[:,0:3] = rotation
cameraMatrix[:,3] = homography[:,2]
cameraMatrix = cameraMatrix/cameraMatrix[2][3] #normalize the matrix
5)据此,摄像机的位置应这样计算:
x,y,z = np.dot(-np.transpose(rotation),translation)

我得到的坐标完全错了。我猜问题应该在步骤4或5的某个地方。我的方法有什么问题吗?

我想我现在明白了。问题在于步骤4中描述的方法。相机位置不能仅从单应性矩阵计算。相机本征矩阵也是必要的。因此,正确的步骤如下:

1)画一张该地区的地图

2)使用cv2.findChessboardCorners的棋盘图像校准相机,这产生相机矩阵和失真系数

3)用世界坐标(3D)和图像坐标(2D)求解pnp。在给定4个对应点和相机矩阵的情况下,solvePnP返回物体在相机坐标系中的原点。

4)现在我需要计算相机在世界坐标中的位置。旋转矩阵为:rotM = cv2.Rodrigues(rvec)[0]

5)摄像机的x、y、z位置为:cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)

相关内容

  • 没有找到相关文章

最新更新