使用OpenCV Python计算相机世界位置

时间:2013-01-21 17:51:16

标签: python opencv computer-vision augmented-reality homography

我想用世界坐标计算相机的位置。这应该相当容易,但我没有得到我期望的结果。我相信我已经阅读了有关此主题的所有内容,但我的代码无效。这是我的所作所为:

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

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

2)我使用cv2.getPerspectiveTransform

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

3)H homography将每个世界坐标转换为摄像机坐标;这工作正常

4)要计算我跟随this的相机矩阵:

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)根据this,相机的位置应按如下方式计算:

x,y,z = np.dot(-np.transpose(rotation),translation)

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

1 个答案:

答案 0 :(得分:12)

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

1)绘制区域地图

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

3)使用世界坐标(3D)和图像坐标(2D)求解P.PnP。给定4个对应点和相机矩阵,solvePnP在相机的坐标系中返回对象的原点。

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

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