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

Posted

技术标签:

【中文标题】使用 OpenCV Python 计算相机世界位置【英文标题】:Calculate camera world position with OpenCV Python 【发布时间】:2013-01-04 20:23:36 【问题描述】:

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

我有一个相机正在观察一个区域。

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

2) 我通过使用cv2.getPerspectiveTransform 将 4 个图像点与地图上的 4 个点进行匹配来计算单应性

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

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 步中。我的方法有什么问题?

【问题讨论】:

你知道这4个点的世界坐标吗? 是的,我知道世界坐标 如果你已经在使用opencv,你可以直接使用solvePnP吗?它会直接给你你的世界位置...... 我刚刚尝试了solvePnP,它返回一个三元素旋转和一个三元素平移向量,但我不确定如何处理它们。 我建议就您的问题提出问题,solvePnP 比 getPerspectiveTransform 更适合查找您的世界位置 【参考方案1】:

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

1) 绘制区域地图

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

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

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

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

【讨论】:

我的情况和你一样,但我有点卡在5)。努力寻找 numpy 的更详细信息以转换为 c/++...您的最后一行类似于...TransMatrix = inverse( rotM.Transpose() ) .PostMult ( TransMatrix ) 还是 - 不是逆向的? 这是世界空间中的位置吧?为了在opengl中使用cameraPositionrotM作为视图矩阵,我必须取反,对吧? @b_m 我们必须传递给solvePnP函数的“世界坐标(3D)”到底是什么?它是已知的吗?我怎样才能找到它? @b_m 为了计算 cameraPosition,rotM 的大小是多少?在 rotM 中,您分配的值 cv2.Rodrigues(rvec)[0] 指的是 Rodrigues 产生的 3x3 旋转矩阵的第一行(因此它具有 1x3 大小)?我坚持这一点,我试图计算相机在世界坐标中的旋转和位置。我将 OpenCV(C++) 与 Unity3D (C#) 结合使用

以上是关于使用 OpenCV Python 计算相机世界位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenCV 中计算点的 3D 坐标

使用 aruco 估计相机的世界位置

双目立体视觉摄像头的标定矫正世界坐标计算(opencv)

OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算

opencv相机标定(Python)

Python之OpenCV相机标定方法