Stereo Reconstruction from the DIC Challenge 1.0

For this exampe we’ll reconstruct the bespoke sample used in the first iteration of the Stereo DIC challenge. To keep the amount of images/data distributed with the package to a minimum, we’ve already run the calibration (but feel free to try running the calibration yourself by downloading all the images from the Stereo DIC challenge archive) and the intrinsic/extrinisic parameters can be called using the function data.dic_ex10_dic_chal_calibration(). In this example we’ll just use the reference images from the left and right camera to build a 3D reconstruction.

# pyvale modules
import numpy as np
from pathlib import Path

from pyvale import dic
from pyvale import calib
from pyvale import strain
from pyvale import data

Import the calibration parameters:

select the images and build the ROI:

# reference images
ref0 = data.dic_chal_3d_cam0()
ref1 = data.dic_chal_3d_cam1()

# Build ROI using cam 0 reference image.
roi = dic.RegionOfInterest(ref0)
# roi.interactive_selection() # <- you can use the interactive_selection to view the yaml
roi.read_yaml(data.dic_ex10_dic_chal_roi()) # <- or you can read the yaml file directly.
ROI
# create an output directory
output_path = Path.cwd() / "pyvale-output" / "dic_ex10"
if not output_path.is_dir():
    output_path.mkdir(parents=True, exist_ok=True)

Perform the DIC:

dic.calculate_3d(reference=[ref0, ref1],
                 deformed=[ref0, ref1],
                 calibration=calib_params,
                 roi_mask=roi.mask,
                 seed=roi.seed,
                 subset_size=27,
                 subset_step=2,
                 output_basepath=output_path)

import the results:

dic_files = output_path / "dic_results_*.csv"
dic_results = dic.import_3d(data=dic_files, delimiter=",", binary=False)

plot a 3d reconstruction using pyvista, using the stereo cost value as the marker colour

import pyvista as pv

stereo = dic_results.stereo
frame = 0


points = np.column_stack((
    np.ravel(stereo.x_mm[frame]),
    np.ravel(stereo.y_mm[frame]),
    np.ravel(stereo.z_mm[frame])
))

cloud = pv.PolyData(points)
cloud["cost"] = np.ravel(stereo.cost[frame])
cloud.plot(
    scalars="cost",
    eye_dome_lighting=True,
)
ROI

Gallery generated by Sphinx-Gallery