旋转cv2.solvePNP的结果以用于PTZ摄像机

时间:2019-10-16 20:27:42

标签: python-3.x opencv rotational-matrices opencv-solvepnp

我有一个安装在固定位置的云台安全摄像机。摄像机的当前平移和倾斜值可随时(通过API)获知。 我从cv2.solepnp()了解一种特定的平移和倾斜组合的外部矩阵。现在,我想找到一种方法来计算任何平移和倾斜值的相机外部矩阵。我需要矩阵来使用函数cv2.projectPoints()

我有两个解决方法,但是都行不通。

想法1:

  • 将cv2.solvepnp()的结果计算为以下形状(r =旋转,p =位置)的4x4矩阵:
r11 r12 r13 p1
r21 r22 r23 p2
r31 r32 r33 p3
  0   0   0  1
  • 现在我将r乘以??对于给定的摄像机平移和倾斜值,将其与逆旋转矩阵结合起来,以获得摄像机的初始矩阵(平移= 0和倾斜= 0)。
  • 要获得任意摇摄和俯仰值的外部矩阵,我将初始矩阵与所需摇摄和俯仰的旋转矩阵相乘。
  • 问题:如果我对初始矩阵求逆以获取我可以看到的世界坐标系中的位置,则相机也会改变位置。但是就像我在上面说的那样,相机安装在固定位置。

想法2:

  • 想法1的唯一变化是,我一开始就将4x4矩阵求逆,以便在世界坐标系中工作。
  • 问题:如何获得旋转矩阵?已知的平移和倾斜值是围绕相机轴而不是世界轴的旋转。

这是2个想法的python实现:

pan = 10 # degree (at the time solvePNP was called)
tilt = 20 # degree (at the time solvePNP was called)

# get extrinsic parameters
(success, rvec_world, tvec_worl) = cv2.solvePnP(objectPoints, imagePoints, camera_matrix, distortion, flags=cv2.SOLVEPNP_ITERATIVE)

# get 4x4 matrix
pose = np.vstack((np.hstack((cv2.Rodrigues(rvec_world)[0], tvec_worl)), [0, 0, 0, 1]))
pose = np.linalg.inv(pose) # This line only for 2. Idea

# calculate initial pose
initial_pose =np.dot(pose,np.linalg.inv(pan_tilt_4x4_matrix(pan,tilt)))

# calculate extrinsic matrix for arbitrary pan and tilt value
arbitrary_pose =np.dot(initial_pose,pan_tilt_4x4_matrix(new_pan,new_tilt))
arbitrary_pose = np.linalg.inv(arbitrary_pose) # This line only for 2. Idea

# now I use the arbitrary_pose matrix with cv2.projectPoints

谢谢。

0 个答案:

没有答案