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