diff --git a/8/1.py b/8/1.py new file mode 100644 index 0000000..760c804 --- /dev/null +++ b/8/1.py @@ -0,0 +1,32 @@ +# 将世界坐标系中的一个点投影到像素坐标系(世界坐标系->相机坐标系->图像坐标系->像素坐标系) + +import numpy as np + +intri = [[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 + + +p1 = np.array([0, 0, 0]) +screen_p1 = project_to_pixel(p1) +print(screen_p1) diff --git a/8/2.py b/8/2.py new file mode 100644 index 0000000..b1393f8 --- /dev/null +++ b/8/2.py @@ -0,0 +1,62 @@ +# 将世界坐标系中从相机中心出发的一条射线上的多个点投影到像素坐标系,验证这些点的投影点相同 + +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()