projet-probleme-inverse-3D/main.py

68 lines
2 KiB
Python
Raw Normal View History

2022-12-17 14:05:14 +00:00
import cv2
import numpy as np
2023-01-11 12:18:31 +00:00
from itertools import product
import pickle
2022-12-17 14:05:14 +00:00
from matrices_reader import *
PICKLE_PATH = "/tmp/pickle.truc"
2023-01-18 16:12:16 +00:00
VOXEL_SIZE = 2e-2
X_MIN, X_MAX = -2.0, 2.0
2022-12-17 14:05:14 +00:00
Y_MIN, Y_MAX = -2.0, 2.0
Z_MIN, Z_MAX = -2.0, 2.0
with open(PICKLE_PATH, 'rb') as file:
projection_matrices = pickle.load(file)
2023-01-18 16:12:16 +00:00
nb_frame = len(projection_matrices) - 1
2023-01-11 12:18:31 +00:00
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))])
2023-01-18 16:12:16 +00:00
points_tor = np.array([[np.cos(theta), np.sin(theta), 0.0, 1.0] for theta, phi, r in product(
np.arange(0, 2*np.pi, 0.1),
np.arange(0, 2*np.pi, 0.1),
np.arange(0.0, 0.25, 0.1))])
mask = np.array([255, 255, 255])
# is_in = []
# p = [0.0, 1.1, 0.0]
2022-12-17 14:05:14 +00:00
for k in range(nb_frame):
2023-01-18 16:12:16 +00:00
# points = np.array([p +[1.0]])
frame = cv2.imread(f'/tmp/masks/Image{k+1:04}.png')
2022-12-17 14:05:14 +00:00
proj_mat = projection_matrices[k]
2023-01-11 12:18:31 +00:00
cam_points = proj_mat @ points.T
cam_points /= cam_points[2,:]
2023-01-18 16:12:16 +00:00
cam_points = np.round(cam_points).astype(np.int32)
2023-01-11 12:18:31 +00:00
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,:]
2022-12-17 14:05:14 +00:00
2023-01-18 16:12:16 +00:00
solid = (frame[cam_points[1,:],cam_points[0,:]] == mask).all(axis=1)
2023-01-11 12:18:31 +00:00
cam_points = cam_points[:,solid]
points = points[solid,:]
2023-01-18 16:12:16 +00:00
# is_in.append(len(points) != 0)
# points = np.array([p + [1.0]])
for k in range(nb_frame):
frame = cv2.imread(f'/tmp/masks/Image{k+1:04}.png')
2023-01-11 12:18:31 +00:00
proj_mat = projection_matrices[k]
cam_points = proj_mat @ points.T
cam_points /= cam_points[2,:]
2023-01-18 16:12:16 +00:00
cam_points = np.round(cam_points).astype(np.int32)
2023-01-11 12:18:31 +00:00
for cam_point in cam_points.T:
2023-01-18 16:12:16 +00:00
# cv2.circle(frame, (cam_point[0], cam_point[1]), 2, (255*is_in[k], 0, 255*(not is_in[k])))
cv2.circle(frame, (cam_point[0], cam_point[1]), 2, (255, 0, 255))
2023-01-11 12:18:31 +00:00
2022-12-17 14:05:14 +00:00
cv2.imshow('Frame', frame)
cv2.waitKey(0)