我正在尝试使用Opencv和Python 2.7从图像中获取世界坐标信息。我正确地执行了相机的校准(参见下面的说明),并以世界坐标获得了相机姿势,包括相机(虚拟)针孔的坐标。我现在需要的是一个函数f(像素),它将图像的像素[x,y]作为输入参数,并返回投影到给定像素上的直线(在世界坐标中)的等式(它是就像在直线上找到一个点的世界坐标一样,因为我已经有了针孔的坐标)。将非常感谢帮助。以下是我已经执行的步骤的说明:
编辑:
这个问题可能看似重复,但事实是我在这个论坛上没有看到这个问题的详细解决方案。
如果我的理解是好的,相机轴系统平行于图像的轴,其第三轴指向相机的视图。因此,很明显,问题相当于以下问题,本身就很有趣:
图像的中心位于相机轴系统的哪个位置(即需要一个平移向量),一个像素的物理长度是多少?
执行的步骤:
在相机前面玩棋盘,我首先获得内在参数矩阵和失真参数(参见opencv-python中的教程):
(ret, mtx, dist, rvecs, tvecs) = cv2.calibrateCamera(objpoints, imgpoints, grayImg.shape[::-1],None,None)
然后我使用以下代码从棋盘的一张图像中获取了相机暂停(外部参数矩阵):
[ret, corners] = cv2.findChessboardCorners(grayImg, [7,7], None)
corners2 = cv2.cornerSubPix(grayImg, corners, (11,11), (-1,-1), criteria)
[ret, rvec, tvec] = cv2.solvePnP(objp, corners2, mtx, dist)
Rmat = cv2.Rodrigues(rvec)[0] #rotation matrix of the camera pause
cameraPinhole = np.dot(-Rmat.T, tvec) #location of the virtual pinhole of the camera with respect to world coordinates
然后我获得了图像上世界坐标轴(位于棋盘角落)的投影,并使用它们在图像上绘制这些轴:
axes = chess_board_square_sz * np.float32([[3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3)
[axes_proj, jac] = cv2.projectPoints(axes, rvec, tvec, newcameramtx, dist)
img = draw_axes(img, corners2, axes_coor)
接下来的步骤应该是什么?