поверните результат cv2.solvePNP для PTZ-камеры - PullRequest
0 голосов
/ 16 октября 2019

У меня есть камера видеонаблюдения, установленная в фиксированном положении. Текущее значение панорамирования и наклона камеры известно в любое время (через API). Я знаю внешнюю матрицу для одной конкретной комбинации панорамирования и наклона из cv2.solepnp (). Теперь я хочу найти способ вычислить внешнюю матрицу камеры для любого значения панорамирования и наклона. Мне нужна матрица для использования функции cv2.projectPoints ()

У меня есть две идеи, как ее решить, но обе не работают.

Идея 1:

  • Рассчитать результат от cv2.solvepnp () до матрицы 4x4 следующей формы (r = вращение, p = положение):
r11 r12 r13 p1
r21 r22 r23 p2
r31 r32 r33 p3
  0   0   0  1
  • Теперь я умножу r?? часть с матрицей обратного вращения для заданного значения панорамирования и наклона камеры, чтобы получить начальную (панорамирование = 0 и наклон = 0) матрицу камеры.
  • Чтобы получить внешнюю матрицу для произвольного панорамирования иЗначение наклона Я умножаю исходную матрицу на матрицу вращения для нужного поворота и наклона.
  • Проблема: Если я инвертирую исходную матрицу, чтобы получить положение в мировой системе координат, я вижу, что камера изменила положениетакже. Но, как я уже говорил выше, камера установлена ​​в фиксированном положении.

Идея 2:

  • Единственное изменение Идеи 1 состоит в том, что я инвертирую матрицу 4x4 в начале, чтобы работать в мировой системе координат.
  • Проблема: Как я могу получить матрицу вращения? Известными значениями панорамирования и наклона являются повороты вокруг оси камеры, а не мировой оси.

Вот реализация на 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

Спасибо зазаранее.

...