我有两个 3d 点,我试图使用它们将其投影到 2d 图像平面上cv::projectPoints()
。最初这些点不在相机的参考系中,所以我必须转换它们。我正在测试该方法转换的有效性。
首先,我手动将平移应用于我的点,并通过旋转矩阵绕 x 轴进行 -90 度旋转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[b][r] - cop[r]
# rotate
transformed_coords[b] = 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 )
Output:
[-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])