Как рассчитать проекцию OpenCV камеры Matrix в Python

Я пытаюсь вычислить projection_matrix, используя OpenCV 2.4 в Python 2.7 для моей камеры (я использую ps eye). Мне это нужно для cv2.triangulatePoints(). Я уже сделал калибровку, используя cv2.calibrateCamera() (используя calibrate.py из примеров OpenCV), поэтому у меня есть rms, camera_matrix, dist_coefs, rvecs и tvecs.

Но у меня проблема с вычислением projection_matrix по этим параметрам (я не нашел примеров Python в Интернете).

PS: Нужно ли калибровать каждую камеру ps eye? У меня есть 3, и я хотел бы отслеживать объект в трехмерном пространстве.

1 ответ

Если у вас только одна камера, матрица проекции должна быть равна camera_matrix. Есть только одно осложнение.

Cv2.triangulatePoints определен для работы с 2 видами с 2 разных камер.

Документация также утверждает, что

Функция восстанавливает трехмерные точки (в однородных координатах), используя их наблюдения со стереокамерой. Матрицы проекций можно получить из стерео Rectify().

Так что да, вам нужно откалибровать каждую камеру и откалибровать каждую пару камер, чтобы извлечь каждую матрицу камеры, матрицу вращения и вектор перевода из одной камеры в "основную камеру".

Для данной пары камер с матрицами камер K1 и K2 верно, что

Матрица проекции основной камеры (камера - мировая система отсчета)

P1 = K1*[I | z]

где I - матрица тождества, а z - вектор 0,0,0 в четвертом столбце. Вы могли бы думать что-то вроде

  1 0 0 0
  0 1 0 0 
  0 0 1 0

Если R - матрица вращения между двумя камерами, а t - расстояние между двумя камерами, то вторая проекционная матрица

P2 = K2*[R | t]

В Python, если вы не можете получить матрицы из StereoRectify, один из способов сделать это вручную

import numpy as np
P = np.concatenate((np.dot(K,R),np.dot(K,t)), axis = 1)
Другие вопросы по тегам