57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
import cv2
|
|
import numpy as np
|
|
from itertools import product
|
|
from rich.progress import track
|
|
|
|
from matrices_reader import *
|
|
|
|
VOXEL_SIZE = 2e-2
|
|
X_MIN, X_MAX = -2.0, 2.0
|
|
Y_MIN, Y_MAX = -2.0, 2.0
|
|
Z_MIN, Z_MAX = -2.0, 2.0
|
|
|
|
projection_matrices = matrices_reader('data/torus/matrices.txt')
|
|
nb_frame = len(projection_matrices)
|
|
|
|
points = np.array([[x, y, z, 1.0] for x, y, z in product(
|
|
np.arange(X_MIN, X_MAX, VOXEL_SIZE),
|
|
np.arange(Y_MIN, Y_MAX, VOXEL_SIZE),
|
|
np.arange(Z_MIN, Z_MAX, VOXEL_SIZE))])
|
|
|
|
background = np.array([18, 18, 18])
|
|
|
|
for k in range(nb_frame):
|
|
frame = cv2.imread(f'data/torus/torus{k+1:04}.png')
|
|
proj_mat = projection_matrices[k]
|
|
|
|
cam_points = proj_mat @ points.T
|
|
cam_points /= cam_points[2,:]
|
|
cam_points = np.round(cam_points, 0).astype(np.int32)
|
|
|
|
visible = np.logical_and.reduce((0 <= cam_points[0,:], cam_points[0,:] < frame.shape[1], 0 <= cam_points[1,:], cam_points[1,:] < frame.shape[0]))
|
|
cam_points = cam_points[:,visible]
|
|
points = points[visible,:]
|
|
|
|
solid = np.invert(((frame[cam_points[1,:],cam_points[0,:]] == background)).all(1))
|
|
cam_points = cam_points[:,solid]
|
|
points = points[solid,:]
|
|
|
|
for k in range(nb_frame):
|
|
frame = cv2.imread(f'data/torus/torus{k+1:04}.png')
|
|
# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
|
# frame = 255 * (frame == 18).astype(np.uint8)
|
|
# frame = cv2.filter2D(frame, -1, np.ones((5, 5)) / 25)
|
|
# frame = 255 * (frame > 255/2).astype(np.uint8)
|
|
|
|
proj_mat = projection_matrices[k]
|
|
|
|
cam_points = proj_mat @ points.T
|
|
cam_points /= cam_points[2,:]
|
|
cam_points = np.round(cam_points, 0).astype(np.int32)
|
|
|
|
for cam_point in cam_points.T:
|
|
cv2.circle(frame, (cam_point[0], cam_point[1]), 2, (255, 0, 0))
|
|
|
|
|
|
cv2.imshow('Frame', frame)
|
|
cv2.waitKey(0) |