使用OpenCV Python计算相机世界位置 [英] Calculate camera world position with OpenCV Python
问题描述
我想计算我的相机在世界坐标中的位置。这应该是相当容易,但我没有得到我期望的结果。我相信我已经阅读关于这个主题的一切,但我的代码不工作。这是我做的:
I want to calculate my camera's position in world coordinates. This should be fairly easy, but I don't get the results I expect. I believe I've read everything on this topic, but my code isn't working. Here's what I do:
我有一个相机看着一个地区。
I have a camera looking at an area.
2)我使用 cv2.getPerspectiveTransform $ c,通过匹配4个图像点到我的地图上的4个点来计算单应性$ c>
3)H单应性将每个世界坐标转换为相机坐标;这是正常工作
3) The H homography transforms every world coordinate to camera coordinate; this is working properly
4)要计算相机矩阵我遵循这:
4) To calculate the camera matrix I followed 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)根据此 ,相机的位置应按如下计算:
5) According to this, the camera's position should be calculated like this:
x,y,z = np.dot(-np.transpose(rotation),translation)
我得到的坐标完全错了。问题应该在步骤4或5的某个地方我猜。我的方法有什么问题?
The coordinates I'm getting are totally wrong. The problem should be somewhere in step 4 or 5 I guess. What's wrong with my method?
推荐答案
我想我现在已经有了。问题是在步骤4中描述的方法。不能从单应矩阵单独计算相机位置。相机内在矩阵也是必要的。因此,正确的程序如下:
I think I've got it now. The problem was with the method described in step 4. The camera position cannot be calculated from the homography matrix alone. The camera intrinsics matrix is also necessary. So, the correct procedure is the following:
1)绘制区域的地图
2)相机使用棋盘图像与 cv2.findChessboardCorners
这产生相机矩阵和失真系数
2) calibrate the camera using the chessboard image with cv2.findChessboardCorners
this yields the camera matrix and the distortion coefficients
3)solvePnP与世界坐标(3D)和图像坐标(2D)。在给定4个对应点和摄像机矩阵的情况下,solvePnP返回对象在摄像机坐标系中的原点。
3) solvePnP with the world coordinates (3D) and image coordinates (2D). The solvePnP returns the object's origo in the camera's coordinate system given the 4 corresponding points and the camera matrix.
4)现在我需要计算摄像机在世界坐标中的位置。旋转矩阵是: rotM = cv2.Rodrigues(rvec)[0]
4) Now I need to calculate the camera's position in world coordinates. The rotation matrix is: rotM = cv2.Rodrigues(rvec)[0]
5)x,y ,相机的z位置为: cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)
5) The x,y,z position of the camera is: cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)
这篇关于使用OpenCV Python计算相机世界位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!