Multi-view reconstruction and Meshing#
0. Import#
[1]:
%matplotlib inline
import cv2
import openalea.phenomenal.data as phm_data
import openalea.phenomenal.display as phm_display
import openalea.phenomenal.object as phm_obj
import openalea.phenomenal.multi_view_reconstruction as phm_mvr
import openalea.phenomenal.mesh as phm_mesh
import openalea.phenomenal.display.notebook as phm_display_notebook
from openalea.phenotyping_data.fetch import fetch_all_data
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[1], line 10
8 import openalea.phenomenal.multi_view_reconstruction as phm_mvr
9 import openalea.phenomenal.mesh as phm_mesh
---> 10 import openalea.phenomenal.display.notebook as phm_display_notebook
11 from openalea.phenotyping_data.fetch import fetch_all_data
File ~/checkouts/readthedocs.org/user_builds/phenomenal/checkouts/v1.9.9/src/openalea/phenomenal/display/notebook.py:13
10 from __future__ import division, print_function, absolute_import
12 import numpy
---> 13 import ipyvolume
15 from ._order_color_map import order_color_map
16 # ==============================================================================
ModuleNotFoundError: No module named 'ipyvolume'
1. Prerequisites#
1.1 Load data#
[2]:
plant_number = 2 # Available : 1, 2, 3, 4 or 5
data_dir = fetch_all_data(f"plant_{plant_number}")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[2], line 2
1 plant_number = 2 # Available : 1, 2, 3, 4 or 5
----> 2 data_dir = fetch_all_data(f"plant_{plant_number}")
NameError: name 'fetch_all_data' is not defined
[3]:
bin_images = phm_data.bin_images(data_dir)
calibrations = phm_data.calibrations(data_dir)
phm_display.show_images(
list(bin_images["side"].values()) + list(bin_images["top"].values())
)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[3], line 1
----> 1 bin_images = phm_data.bin_images(data_dir)
2 calibrations = phm_data.calibrations(data_dir)
4 phm_display.show_images(
5 list(bin_images["side"].values()) + list(bin_images["top"].values())
6 )
NameError: name 'data_dir' is not defined
2. Multi-view reconstruction#
2.1 Associate images and projection function#
[4]:
def routine_select_ref_angle(bin_side_images):
max_len = 0
max_angle = None
for angle in bin_side_images:
x_pos, y_pos, x_len, y_len = cv2.boundingRect(
cv2.findNonZero(bin_side_images[angle])
)
if x_len > max_len:
max_len = x_len
max_angle = angle
return max_angle
[5]:
refs_angle_list = [routine_select_ref_angle(bin_images["side"])]
print(refs_angle_list)
image_views = list()
for id_camera in bin_images:
for angle in bin_images[id_camera]:
projection = calibrations[id_camera].get_projection(angle)
image_ref = None
if id_camera == "side" and angle in refs_angle_list:
image_ref = bin_images[id_camera][angle]
inclusive = False
if id_camera == "top":
inclusive = True
image_views.append(
phm_obj.ImageView(
bin_images[id_camera][angle],
projection,
inclusive=inclusive,
image_ref=image_ref,
)
)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[5], line 1
----> 1 refs_angle_list = [routine_select_ref_angle(bin_images["side"])]
2 print(refs_angle_list)
4 image_views = list()
NameError: name 'bin_images' is not defined
2.2 Do multi-view reconstruction#
[6]:
voxels_size = 16 # mm
error_tolerance = 0
voxel_grid = phm_mvr.reconstruction_3d(
image_views, voxels_size=voxels_size, error_tolerance=error_tolerance
)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[6], line 4
1 voxels_size = 16 # mm
2 error_tolerance = 0
3 voxel_grid = phm_mvr.reconstruction_3d(
----> 4 image_views, voxels_size=voxels_size, error_tolerance=error_tolerance
5 )
NameError: name 'image_views' is not defined
2.4 Save / Load voxel grid#
[7]:
voxel_grid.write(f"plant_{plant_number}_size_{voxels_size}.npz")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[7], line 1
----> 1 voxel_grid.write(f"plant_{plant_number}_size_{voxels_size}.npz")
NameError: name 'voxel_grid' is not defined
[8]:
voxel_grid = phm_obj.VoxelGrid.read(f"plant_{plant_number}_size_{voxels_size}.npz")
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[8], line 1
----> 1 voxel_grid = phm_obj.VoxelGrid.read(f"plant_{plant_number}_size_{voxels_size}.npz")
File ~/checkouts/readthedocs.org/user_builds/phenomenal/checkouts/v1.9.9/src/openalea/phenomenal/object/voxelGrid.py:184, in VoxelGrid.read(filename, voxel_size)
181 ext = filename.split(".")[-1]
183 if ext == "npz":
--> 184 return VoxelGrid.read_from_npz(filename)
185 if ext == "json":
186 return VoxelGrid.read_from_json(filename)
File ~/checkouts/readthedocs.org/user_builds/phenomenal/checkouts/v1.9.9/src/openalea/phenomenal/object/voxelGrid.py:200, in VoxelGrid.read_from_npz(filename)
198 @staticmethod
199 def read_from_npz(filename):
--> 200 image_3d = Image3D.read_from_npz(filename)
201 return VoxelGrid.from_image_3d(image_3d)
File ~/checkouts/readthedocs.org/user_builds/phenomenal/checkouts/v1.9.9/src/openalea/phenomenal/object/image3D.py:89, in Image3D.read_from_npz(filename)
87 @staticmethod
88 def read_from_npz(filename):
---> 89 npz = numpy.load(filename, allow_pickle=False)
91 image = npz["image"]
92 voxels_size = int(npz["voxels_size"])
File ~/checkouts/readthedocs.org/user_builds/phenomenal/conda/v1.9.9/lib/python3.13/site-packages/numpy/lib/_npyio_impl.py:451, in load(file, mmap_mode, allow_pickle, fix_imports, encoding, max_header_size)
449 own_fid = False
450 else:
--> 451 fid = stack.enter_context(open(os.fspath(file), "rb"))
452 own_fid = True
454 # Code to distinguish from NumPy binary files and pickles.
FileNotFoundError: [Errno 2] No such file or directory: 'plant_2_size_16.npz'
2.5 Viewing#
[9]:
phm_display_notebook.show_voxel_grid(voxel_grid, size=1)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[9], line 1
----> 1 phm_display_notebook.show_voxel_grid(voxel_grid, size=1)
NameError: name 'phm_display_notebook' is not defined
3.Meshing#
[10]:
vertices, faces = phm_mesh.meshing(
voxel_grid.to_image_3d(), reduction=0.90, smoothing_iteration=5, verbose=True
)
print("Number of vertices : {nb_vertices}".format(nb_vertices=len(vertices)))
print("Number of faces : {nb_faces}".format(nb_faces=len(faces)))
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[10], line 2
1 vertices, faces = phm_mesh.meshing(
----> 2 voxel_grid.to_image_3d(), reduction=0.90, smoothing_iteration=5, verbose=True
3 )
5 print("Number of vertices : {nb_vertices}".format(nb_vertices=len(vertices)))
6 print("Number of faces : {nb_faces}".format(nb_faces=len(faces)))
NameError: name 'voxel_grid' is not defined
Viewing#
[11]:
phm_display_notebook.show_mesh(vertices, faces)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[11], line 1
----> 1 phm_display_notebook.show_mesh(vertices, faces)
NameError: name 'phm_display_notebook' is not defined