У меня есть две трехмерные точки, которые я пытаюсь спроецировать на плоскость двухмерного изображения с помощью cv::projectPoints(). Изначально точки не находятся в системе координат камеры, поэтому мне приходится их трансформировать. Я проверяю достоверность преобразований метода.
Сначала я вручную применяю сдвиг к своим точкам, а также поворот на -90 градусов вокруг оси X с помощью матрицы вращения matr .
import numpy as np
import math
import cv2
# center of projection
cop = np.array([-14.45194, 34.59882, 19.11343])
# get rotation
r_vec = cv2.Rodrigues(np.array(matr))[0]
print([round(math.degrees(i),2) for i in r_vec])
# init arrays
coords = np.array([[4.27874, 115.15968, 18.1621], [27.52924, 113.3441, 17.70207]])
transformed_coords = np.zeros(coords.shape)
# transform coords
for b, _ in enumerate(coords):
arr = np.array([0,0,0])
# translate
for r in range(3):
arr[r] = coords[r] - cop[r]
# rotate
transformed_coords = np.dot(matr, arr)
Затем я передаю преобразованные координаты в projectPoints() и сравниваю полученные 2D-точки с точками, которые я получаю, передав преобразование в метод.points_2d = cv2.projectPoints(np.array(transformed_coords), np.array([0.0,0.0,0.0]), np.array([0.0,0.0,0.0]), cam_matrix, distortion)[0]
print("Manual Transformation Projection: ")
print(points_2d )
points_2d = cv2.projectPoints(np.array(coords), np.array(r_vec), np.array(cop), cam_matrix, distortion)[0]
print("\nOpenCV Transformation Projection: ")
print(points_2d )
Выход:
[-90.0, 0.0, 0.0] # matr rotation
Manual Transformation Projection:
[[[596.41419111 538.38054858]]
[[159.74685131 557.65317027]]]
OpenCV Transformation Projection:
[[[1101.1539809 -274.07081182]]
[[ 738.45477039 -281.42273082]]]
Почему они разные?
Кстати, вот матрица камеры и дисторсия, если вы хотите ее воссоздать:
cam_matrix = np.array([[1561.9015217711233, 0, 944.3790845611046], [0, 1557.8348925840205, 538.3374859400157], [0, 0, 1]])
distortion = np.array([-0.2136432557736835, 0.20055112514542725, 0.00054631323043295, -0.00067835485282051, -0.07781645541334031])
Подробнее здесь: https://stackoverflow.com/questions/733 ... projecting
Как OpenCV projectPoints выполняет преобразования перед проецированием? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение