У меня есть камера видеонаблюдения, установленная в фиксированном положении. Текущее значение панорамирования и наклона камеры известно в любое время (через 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
Спасибо зазаранее.