Using Photometric Stereo

The code shows how to use Photometric Stereo from calibration to retrieve the results.

C++

#include <eVision/Easy3D/EPhotometricStereoImager.h>
using namespace eVision;
using namespace eVision::Easy3D;

EPhotometricStereoImager photometricStereo;

std::vector<EImageBW8> calibrationImages;
// Load calibration images (Todo)
std::vector<EROIBW8> calibrationROIs;
// Set the calibration ROIs (Todo)

// Calibrate
float score = photometricStereo.CalibrateFromSphere(calibrationROIs);

std::vector<EImageBW8> objectImages;
// Load object images in the same order than the calibration images/angles (Todo)

std::vector<EROIBW8> objectROIs;
// Set the object ROIs (Todo)

// Compute
photometricStereo.Compute(objectROIs);

// Retrieve the results
EImageC24 normals = photometricStereo.GetNormals();
EImageBW8 albedos = photometricStereo.GetAlbedos(Easy3D::EPhotometricStereoContrast_HighContrast);
EImageBW8 gradientsX = photometricStereo.GetGradientsX();
EImageBW8 gradientsY = photometricStereo.GetGradientsY();
EImageBW8 gaussianCurvatures = photometricStereo.ComputeGaussianCurvatures(Easy3D::EPhotometricStereoContrast_HighContrast);
EImageBW8 meanCurvatures = photometricStereo.ComputeMeanCurvatures(Easy3D::EPhotometricStereoContrast_HighContrast);
EZMap8 heightMap = photometricStereo.ComputeHeightMap();

C#

using eVision;
using eVision.Easy3D;
EPhotometricStereoImager photometricStereo = new EPhotometricStereoImager();

EImageBW8[] calibrationImages = new EImageBW8[4];
// Load calibration images (Todo)
EROIBW8[] calibrationROIs = new EROIBW8[4];
// Set the calibration ROIs (Todo)

// Calibrate
float score = photometricStereo.CalibrateFromSphere(calibrationROIs);

EImageBW8[] objectImages = new EImageBW8[4];
// Load object images in the same order than the calibration images/angles (Todo)

EROIBW8[] objectROIs = new EROIBW8[4];
// Set the object ROIs (Todo)

// Compute
photometricStereo.Compute(objectROIs);

// Retrieve the results
EImageC24 normals = photometricStereo.Normals;
EImageBW8 albedos = photometricStereo.GetAlbedos(EPhotometricStereoContrast.HighContrast);
EImageBW8 gradientsX = photometricStereo.GradientsX;
EImageBW8 gradientsY = photometricStereo.GradientsY;
EImageBW8 gaussianCurvatures = photometricStereo.ComputeGaussianCurvatures(EPhotometricStereoContrast.HighContrast);
EImageBW8 meanCurvatures = photometricStereo.ComputeMeanCurvatures(EPhotometricStereoContrast.HighContrast);
EZMap8 heightMap = photometricStereo.ComputeHeightMap();

Python

import eVision
from eVision import Easy3D
from typing import cast
photometric_stereo = Easy3D.EPhotometricStereoImager()

calibration_images = [eVision.EImageBW8(), eVision.EImageBW8(),
    eVision.EImageBW8(), eVision.EImageBW8()]
# Load calibration images (Todo)
calibration_rois: list[eVision.EROIBW8 | None] = [eVision.EROIBW8(), eVision.EROIBW8(),
    eVision.EROIBW8(), eVision.EROIBW8()]
# Set the calibration ROIs (Todo)

# Calibrate
score = photometric_stereo.CalibrateFromSphere(calibration_rois)

object_images = [eVision.EImageBW8(), eVision.EImageBW8(),
    eVision.EImageBW8(), eVision.EImageBW8()]
# Load object images in the same order than the calibration images/angles (Todo)

object_rois: list[eVision.EROIBW8 | None] = [eVision.EROIBW8(), eVision.EROIBW8(),
    eVision.EROIBW8(), eVision.EROIBW8()]
# Set the object ROIs (Todo)

# Compute
photometric_stereo.Compute(object_rois)

# Retrieve the results
normals = photometric_stereo.Normals
albedos = photometric_stereo.GetAlbedos(Easy3D.EPhotometricStereoContrast.HighContrast)
gradientsX = photometric_stereo.GradientsX
gradientsY = photometric_stereo.GradientsY
gaussian_curvatures = photometric_stereo.ComputeGaussianCurvatures(Easy3D.EPhotometricStereoContrast.HighContrast)
mean_curvatures = photometric_stereo.ComputeMeanCurvatures(Easy3D.EPhotometricStereoContrast.HighContrast)
height_map = photometric_stereo.ComputeHeightMap()