通过opencv获得投影到图像中给定像素上的直线方程

时间:2015-10-28 15:16:38

标签: python opencv camera-calibration coordinate-transformation

我正在尝试使用Opencv和Python 2.7从图像中获取世界坐标信息。我正确地执行了相机的校准(参见下面的说明),并以世界坐标获得了相机姿势,包括相机(虚拟)针孔的坐标。我现在需要的是一个函数f(像素),它将图像的像素[x,y]作为输入参数,并返回投影到给定像素上的直线(在世界坐标中)的等式(它是就像在直线上找到一个点的世界坐标一样,因为我已经有了针孔的坐标)。将非常感谢帮助。以下是我已经执行的步骤的说明:

编辑:

  1. 这个问题可能看似重复,但事实是我在这个论坛上没有看到这个问题的详细解决方案。

  2. 如果我的理解是好的,相机轴系统平行于图像的轴,其第三轴指向相机的视图。因此,很明显,问题相当于以下问题,本身就很有趣:

  3. 图像的中心位于相机轴系统的哪个位置(即需要一个平移向量),一个像素的物理长度是多少?

    执行的步骤:

    在相机前面玩棋盘,我首先获得内在参数矩阵和失真参数(参见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)
    

    接下来的步骤应该是什么?

0 个答案:

没有答案