Files
2024-10-30 18:21:46 +08:00

63 lines
1.7 KiB
Python

# 将世界坐标系中从相机中心出发的一条射线上的多个点投影到像素坐标系,验证这些点的投影点相同
import matplotlib.pyplot as plt
import numpy as np
intri = np.array([[1111.0, 0.0, 400.0], [0.0, 1111.0, 400.0], [0.0, 0.0, 1.0]])
extri = np.array(
[
[-9.9990e-01, 4.1922e-03, -1.3346e-02, -5.3798e-02],
[-1.3989e-02, -2.9966e-01, 9.5394e-01, 3.8455e00],
[-4.6566e-10, 9.5404e-01, 2.9969e-01, 1.2081e00],
[0.0, 0.0, 0.0, 1.0],
]
)
def project_to_pixel(world_point):
R = extri[:3, :3]
T = extri[:3, -1]
cam_p1 = np.dot(world_point - T, R)
pixel_point = np.array(
[
-cam_p1[0] * intri[0][0] / cam_p1[2] + intri[0][2],
cam_p1[1] * intri[1][1] / cam_p1[2] + intri[1][2],
]
)
return pixel_point
camera_origin = extri[:3, -1]
direction = extri[:3, :3].dot(np.array([1, 1, 10]))
direction /= np.linalg.norm(direction)
scale_factors = np.linspace(1, 10, 10)
for scale in scale_factors:
sampled_point = camera_origin + scale * direction
pixel_point = project_to_pixel(sampled_point)
print(f"Sampled Point: {sampled_point}, Pixel Coordinate: {pixel_point}")
sampled_points = np.array(
[camera_origin + scale * direction for scale in scale_factors]
)
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
ax.scatter(
camera_origin[0],
camera_origin[1],
camera_origin[2],
color="red",
label="Camera Origin",
)
ax.text(camera_origin[0], camera_origin[1], camera_origin[2], "Camera", color="red")
ax.plot(
sampled_points[:, 0],
sampled_points[:, 1],
sampled_points[:, 2],
"bo-",
label="Sample Points on Ray",
)
ax.legend()
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
plt.show()