Examples

Loading a Measurment

This example demonstrates how to load and process hyperspectral measurement data using the cuvis SDK.

#include "cuvis.h"

#include <assert.h>
#include <stdint.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
  if (argc != 3)
  {
    printf("To few Arguments! Please provide:\n");
    printf("user settings directory\n");
    printf("sessionfile (.cu3s)\n");

    return -1;
  }

  char* const userSettingsDir = argv[1];
  char* const sessionLoc = argv[2];

  CUVIS_SESSION_FILE sess;
  CUVIS_MESU mesu1;
  unsigned chn;

  unsigned x;
  unsigned y;

  const uint16_t* cube16bit;
  //const uint16_t* info_ptr;

  printf("Example 01 load measurement\n");
  printf("\nUser Settings Dir: ");
  printf(userSettingsDir);
  printf("\nsessionfile (.cu3s): ");
  printf(sessionLoc);

  printf("\nloading user settings...\n");
  CUVIS_CHECK(cuvis_init(userSettingsDir, loglevel_debug));
  CUVIS_CHECK(cuvis_set_log_level(loglevel_info));

  printf("loading session...\n");
  CUVIS_CHECK(cuvis_session_file_load(sessionLoc, &sess));

  printf("loading measurement...\n");
  CUVIS_CHECK(cuvis_session_file_get_mesu(
      sess, 0, session_item_type_frames_no_gaps, &mesu1));

  CUVIS_MESU_METADATA mesu_data;
  CUVIS_CHECK(cuvis_measurement_get_metadata(mesu1, &mesu_data));
  printf(
      "data 1 %s %.2f ms mode=%d flags=%d\n",
      mesu_data.name,
      mesu_data.integration_time,
      mesu_data.processing_mode,
      mesu_data.measurement_flags);

  assert(
      mesu_data.processing_mode == Cube_Raw &&
      "This example requires raw mode");

  CUVIS_IMBUFFER cube;
  CUVIS_CHECK(
      cuvis_measurement_get_data_image(mesu1, CUVIS_MESU_CUBE_KEY, &cube));
  CUVIS_IMBUFFER iminfo;
  cuvis_measurement_get_data_image(mesu1, CUVIS_MESU_CUBE_INFO_KEY, &iminfo);

  CUVIS_CHECK(cuvis_measurement_get_metadata(mesu1, &mesu_data));
  if (mesu_data.measurement_flags & CUVIS_MESU_FLAG_OVERILLUMINATED)
  {
    printf("-- is overilluminated --\n");
  }
  else
  {
    printf("-- is NOT overilluminated --\n");
  }

  if (mesu_data.measurement_flags & CUVIS_MESU_FLAG_POOR_REFERENCE)
  {
    printf("-- has poor reference --\n");
  }
  else
  {
    printf("-- has GOOD reference --\n");
  }

  printf("INFO cube No of channels: %d\n", iminfo.channels);
  printf("INFO cube width: %d\n", iminfo.width);
  printf("INFO cube height: %d\n", iminfo.height);
  printf("DATA cube width: %d\n", cube.width);
  printf("DATA cube height: %d\n", cube.height);
  printf("INFO cube type: %d\n", iminfo.format);
  printf("INFO cube bytes: %d\n", iminfo.bytes);
  printf("DATA cube type: %d\n", cube.format);
  printf("DATA cube bytes: %d\n", cube.bytes);

  assert(
      cube.format == imbuffer_format_uint16 &&
      "16 bit cube required for this example");

  //reinterpret as uint16
  cube16bit = (const uint16_t*)(cube.raw);
  //info_ptr = (const uint16_t*)(iminfo.raw);

  x = 120;
  y = 200;

  assert(x < cube.width && "x index exceeds cube width");
  assert(y < cube.height && "x index exceeds cube width");

  printf("lambda [nm]; raw counts [au]; pixel info \n");
  for (chn = 0; chn < cube.channels; chn++)
  {
    // memory layout:
    //unsigned index = (y * cube.width + x) * cube.channels + chn;
    //uint16_t value = cube16bit[index];

    uint16_t value = IMBUFFER_GET(cube16bit, x, y, chn, cube);
    //only works with v3.X CUVIS data
    //auto pixel_info = IMBUFFER_GET(info_ptr, x, y, 0, iminfo);
    unsigned lambda = cube.wavelength[chn];

    printf(
        "%d; %d \n",
        //"%d; %d; %d \n",
        lambda,
        value
        //pixel_info);
    );
  }
  printf(" \n");

  //for (x = 0; x < cube.width; x++)
  //{
  //  for (y = 0; y < cube.height; y++)
  //  {
  // memory layout:
  //unsigned index = (y * cube.width + x) * cube.channels + chn;
  //uint16_t value = cube16bit[index];

  //auto pixel_info = IMBUFFER_GET(info_ptr, x, y, 0, iminfo);

  //printf("%d; ", pixel_info);
  //  }
  //  printf(" \n");
  //}

  cuvis_measurement_free(&mesu1);
  cuvis_session_file_free(&sess);
  cuvis_shutdown();
  printf("finished.\n");
}

Reprocessing a Measurement

This example demonstrates the process of reprocessing hyperspectral measurement data using the cuvis SDK.

#include "cuvis.h"

#include <stdio.h>

int main(int argc, char* argv[])
{
  if (argc != 7)
  {
    printf("To few Arguments! Please provide:\n");
    printf("user settings directory\n");
    printf("measurement file (.cu3s)\n");
    printf("dark file (.cu3s)\n");
    printf("white file (.cu3s)\n");
    printf("distance file (.cu3s)\n");
    printf("Name of output directory\n");

    return -1;
  }

  char* const userSettingsDir = argv[1];
  char* const measurementLoc = argv[2];
  char* const darkLoc = argv[3];
  char* const whiteLoc = argv[4];
  char* const distanceLoc = argv[5];
  char* const outDir = argv[6];

  printf("Example 02 reprocess measurement \n");
  printf("user Settings Dir: ");
  printf(userSettingsDir);
  printf("\nmeasurement file (.cu3s): ");
  printf(measurementLoc);
  printf("\ndark file (.cu3s): ");
  printf(darkLoc);
  printf("\nwhite file (.cu3s): ");
  printf(whiteLoc);
  printf("\ndistance file (.cu3s): ");
  printf(distanceLoc);
  printf("\noutput Dir: ");
  printf(outDir);

  CUVIS_SESSION_FILE sessMesu;
  CUVIS_SESSION_FILE sessDark;
  CUVIS_SESSION_FILE sessWhite;
  CUVIS_SESSION_FILE sessDistance;

  CUVIS_MESU mesu;
  CUVIS_MESU_METADATA mesu_data;
  CUVIS_MESU dark;
  CUVIS_MESU white;
  CUVIS_MESU distance;

  CUVIS_PROC_CONT procCont;

  CUVIS_INT is_capable;

  printf("\nloading settings... \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_init(userSettingsDir, loglevel_debug));

  printf("loading sessionfiles... \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_session_file_load(measurementLoc, &sessMesu));
  CUVIS_CHECK(cuvis_session_file_load(darkLoc, &sessDark));
  CUVIS_CHECK(cuvis_session_file_load(whiteLoc, &sessWhite));
  CUVIS_CHECK(cuvis_session_file_load(distanceLoc, &sessDistance));

  printf("loading measurement... \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_session_file_get_mesu(sessMesu, 0, session_item_type_frames_no_gaps, &mesu));
  CUVIS_CHECK(cuvis_session_file_get_mesu(sessDark, 0, session_item_type_frames_no_gaps, &dark));
  CUVIS_CHECK(cuvis_session_file_get_mesu(sessWhite, 0, session_item_type_frames_no_gaps, &white));
  CUVIS_CHECK(cuvis_session_file_get_mesu(sessDistance, 0, session_item_type_frames_no_gaps, &distance));

  CUVIS_CHECK(cuvis_measurement_get_metadata(mesu, &mesu_data));
  printf(
      "data 1 %s %.2f ms mode=%d flags=%d\n",
      mesu_data.name,
      mesu_data.integration_time,
      mesu_data.processing_mode,
      mesu_data.measurement_flags);
  fflush(stdout);

  printf("Load processing context...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_proc_cont_create_from_session_file(sessMesu, &procCont));

  printf("Set references ...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_proc_cont_set_reference(procCont, dark, Reference_Dark));
  CUVIS_CHECK(cuvis_proc_cont_set_reference(procCont, white, Reference_White));
  CUVIS_CHECK(cuvis_proc_cont_set_reference(procCont, distance, Reference_Distance));

  printf("Prepare processing and export ...\n");
  CUVIS_PROC_ARGS args;
  args.processing_mode = Cube_Raw;
  args.allow_recalib = 0;
  CUVIS_CHECK(cuvis_proc_cont_is_capable(procCont, mesu, args, &is_capable));

  CUVIS_EXPORT_GENERAL_SETTINGS general_settings = {
    "", //initializer list only takes const char*, leave empty and modify afterwards.
    "all",
    1,
    0.0,
    pan_sharpening_interpolation_type_NearestNeighbor,
    pan_sharpening_algorithm_Noop,
    0,
    0};

  CUVIS_EXPORT_CUBE_SETTINGS cube_settings;
  cube_settings.allow_fragmentation = 0;
  cube_settings.allow_overwrite = 1;
  cube_settings.allow_session_file = 1;
  cube_settings.operation_mode = OperationMode_Internal;
  cube_settings.allow_info_file = 0;

  if (1 == is_capable)
  {
    printf("reprocess measurement to Cube_Raw mode...\n");
    fflush(stdout);

    CUVIS_CHECK(cuvis_proc_cont_set_args(procCont, args));
    CUVIS_CHECK(cuvis_proc_cont_apply(procCont, mesu));
    printf(" done. \n");
    fflush(stdout);

    CUVIS_CHECK(cuvis_measurement_get_metadata(mesu, &mesu_data));
    printf(
        "data 1 %s %.2f ms mode=%d flags=%d\n",
        mesu_data.name,
        mesu_data.integration_time,
        mesu_data.processing_mode,
        mesu_data.measurement_flags);
    fflush(stdout);

    char exportDirRAW[CUVIS_MAXBUF];
    strcpy(exportDirRAW, outDir);
    strcat(exportDirRAW, "/RAW");

    strcpy(general_settings.export_dir, exportDirRAW);
    CUVIS_EXPORTER cube_exporter;
    CUVIS_CHECK(cuvis_exporter_create_cube(
        &cube_exporter, general_settings, cube_settings));
    CUVIS_CHECK(cuvis_exporter_apply(cube_exporter, mesu));
    cuvis_exporter_free(&cube_exporter);
  }
  else
  {
    printf("Cannot process to Cube_Raw mode.\n");
    fflush(stdout);
  }

  args.processing_mode = Cube_DarkSubtract;
  CUVIS_CHECK(cuvis_proc_cont_is_capable(procCont, mesu, args, &is_capable));

  if (1 == is_capable)
  {
    printf("reprocess measurement to Cube_DarkSubtract mode...");
    fflush(stdout);
    CUVIS_CHECK(cuvis_proc_cont_set_args(procCont, args));
    CUVIS_CHECK(cuvis_proc_cont_apply(procCont, mesu));
    printf(" done. \n");
    fflush(stdout);

    CUVIS_CHECK(cuvis_measurement_get_metadata(mesu, &mesu_data));
    printf(
        "data 1 %s %.2f ms mode=%d flags=%d\n",
        mesu_data.name,
        mesu_data.integration_time,
        mesu_data.processing_mode,
        mesu_data.measurement_flags);
    fflush(stdout);

    char exportDirDS[CUVIS_MAXBUF];
    strcpy(exportDirDS, outDir);
    strcat(exportDirDS, "/DS");

    strcpy(general_settings.export_dir, exportDirDS);
    CUVIS_EXPORTER cube_exporter;
    CUVIS_CHECK(cuvis_exporter_create_cube(
        &cube_exporter, general_settings, cube_settings));
    CUVIS_CHECK(cuvis_exporter_apply(cube_exporter, mesu));
    cuvis_exporter_free(&cube_exporter);
  }
  else
  {
    printf("Cannot process to Cube_DarkSubtract mode.\n");
    fflush(stdout);
  }

  args.processing_mode = Cube_Reflectance;
  CUVIS_CHECK(cuvis_proc_cont_is_capable(procCont, mesu, args, &is_capable));

  if (1 == is_capable)
  {
    printf("reprocess measurement to Cube_Reflectance mode...\n");
    fflush(stdout);

    CUVIS_CHECK(cuvis_proc_cont_set_args(procCont, args));
    CUVIS_CHECK(cuvis_proc_cont_apply(procCont, mesu));
    printf(" done. \n");
    fflush(stdout);

    CUVIS_CHECK(cuvis_measurement_get_metadata(mesu, &mesu_data));
    printf(
        "data 1 %s %.2f ms mode=%d flags=%d\n",
        mesu_data.name,
        mesu_data.integration_time,
        mesu_data.processing_mode,
        mesu_data.measurement_flags);
    fflush(stdout);

    char exportDirREF[CUVIS_MAXBUF];
    strcpy(exportDirREF, outDir);
    strcat(exportDirREF, "/REF");

    strcpy(general_settings.export_dir, exportDirREF);
    CUVIS_EXPORTER cube_exporter;
    CUVIS_CHECK(cuvis_exporter_create_cube(
        &cube_exporter, general_settings, cube_settings));
    CUVIS_CHECK(cuvis_exporter_apply(cube_exporter, mesu));
    cuvis_exporter_free(&cube_exporter);
  }
  else
  {
    printf("Cannot process to Cube_Reflectance mode.\n");
    fflush(stdout);
  }

  args.processing_mode = Cube_SpectralRadiance;
  CUVIS_CHECK(cuvis_proc_cont_is_capable(procCont, mesu, args, &is_capable));

  if (1 == is_capable)
  {
    printf("reprocess measurement to Cube_SpectralRadiance mode...\n");
    fflush(stdout);
    CUVIS_CHECK(cuvis_proc_cont_set_args(procCont, args));
    CUVIS_CHECK(cuvis_proc_cont_apply(procCont, mesu));
    printf(" done. \n");
    fflush(stdout);

    CUVIS_CHECK(cuvis_measurement_get_metadata(mesu, &mesu_data));
    printf(
        "data 1 %s %.2f ms mode=%d flags=%d\n",
        mesu_data.name,
        mesu_data.integration_time,
        mesu_data.processing_mode,
        mesu_data.measurement_flags);
    fflush(stdout);

    char exportDirSPRAD[CUVIS_MAXBUF];
    strcpy(exportDirSPRAD, outDir);
    strcat(exportDirSPRAD, "/SPRAD");

    strcpy(general_settings.export_dir, exportDirSPRAD);
    CUVIS_EXPORTER cube_exporter;
    CUVIS_CHECK(cuvis_exporter_create_cube(
        &cube_exporter, general_settings, cube_settings));
    CUVIS_CHECK(cuvis_exporter_apply(cube_exporter, mesu));
    cuvis_exporter_free(&cube_exporter);
  }
  else
  {
    printf("Cannot process to Cube_SpectralRadiance mode.\n");
    fflush(stdout);
  }

  cuvis_proc_cont_free(&procCont);
  cuvis_measurement_free(&mesu);
  cuvis_measurement_free(&dark);
  cuvis_measurement_free(&white);
  cuvis_measurement_free(&distance);
  cuvis_session_file_free(&sessMesu);
  cuvis_session_file_free(&sessDark);
  cuvis_session_file_free(&sessWhite);
  cuvis_session_file_free(&sessDistance);
  cuvis_shutdown();
}

Exporting a Measurement

This example demonstrates exporting hyperspectral measurement data into various formats using the cuvis SDK.

#include "cuvis.h"

#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char* argv[])
{
  if (argc != 5)
  {
    printf("To few Arguments! Please provide:\n");
    printf("user settings directory\n");
    printf("sessionfile (.cu3s)\n");
    printf("user plugin file (.xml)\n");
    printf("Name of export directory\n");
    fflush(stdout);

    return -1;
  }
  const char* userSettingsDir = argv[1];
  const char* sessionLoc = argv[2];
  const char* pluginLoc = argv[3];
  const char* exportDir = argv[4];

  printf("Example 03 export measurement\n");
  printf("User Settings Dir: ");
  printf(userSettingsDir);
  printf("\nsessionfile (.cu3s): ");
  printf(sessionLoc);
  printf("\nuser plugin file (.xml): ");
  printf(pluginLoc);
  printf("\nExport Dir: ");
  printf(exportDir);
  fflush(stdout);

  CUVIS_SESSION_FILE sess;
  CUVIS_MESU mesu;

  CUVIS_EXPORTER envi_exporter;
  CUVIS_EXPORTER single_tiff_exporter;

  CUVIS_EXPORT_TIFF_SETTINGS single_tiff_settings;

  CUVIS_EXPORTER multi_tiff_exporter;
  CUVIS_EXPORT_TIFF_SETTINGS multi_tiff_settings;

  CUVIS_EXPORTER view_exporter;
  CUVIS_EXPORT_VIEW_SETTINGS view_settings;

  CUVIS_EXPORTER cube_exporter;

  char* buffer = 0;
  long length;
  FILE* f;

  printf("\nloading user settings...\n");
  fflush(stdout);

  CUVIS_CHECK(cuvis_init(userSettingsDir, loglevel_debug));
#ifdef _DEBUG
  CUVIS_CHECK(cuvis_set_log_level(loglevel_debug));
#else
  CUVIS_CHECK(cuvis_set_log_level(loglevel_info));
#endif

  CUVIS_EXPORT_GENERAL_SETTINGS general_settings_envi = {
      "", //initializer list only takes const char*, leave empty and modify afterwards.
      "all",
      1,
      0.0,
      pan_sharpening_interpolation_type_NearestNeighbor,
      pan_sharpening_algorithm_Noop,
      0,
      0};

  char exportDirEnvi[CUVIS_MAXBUF];
  strcpy(exportDirEnvi, exportDir);
  strcat(exportDirEnvi, "/envi");
  strcpy(general_settings_envi.export_dir, exportDirEnvi);

  CUVIS_EXPORT_GENERAL_SETTINGS general_settings_single = {
      "", //initializer list only takes const char*, leave empty and modify afterwards.
      "all",
      1,
      0.0,
      pan_sharpening_interpolation_type_NearestNeighbor,
      pan_sharpening_algorithm_Noop,
      0,
      0};
  char exportDirSingle[CUVIS_MAXBUF];
  strcpy(exportDirSingle, exportDir);
  strcat(exportDirSingle, "/single");
  strcpy(general_settings_single.export_dir, exportDirSingle);

  CUVIS_EXPORT_GENERAL_SETTINGS general_settings_multi = {
      "", //initializer list only takes const char*, leave empty and modify afterwards.
      "all",
      1,
      0.0,
      pan_sharpening_interpolation_type_NearestNeighbor,
      pan_sharpening_algorithm_Noop,
      0,
      0};
  char exportDirMulti[CUVIS_MAXBUF];
  strcpy(exportDirMulti, exportDir);
  strcat(exportDirMulti, "/multi");
  strcpy(general_settings_multi.export_dir, exportDirMulti);

  CUVIS_EXPORT_GENERAL_SETTINGS general_settings_view = {
      "", //initializer list only takes const char*, leave empty and modify afterwards.
      "all",
      1,
      0.0,
      pan_sharpening_interpolation_type_NearestNeighbor,
      pan_sharpening_algorithm_Noop,
      0,
      0};
  char exportDirView[CUVIS_MAXBUF];
  strcpy(exportDirView, exportDir);
  strcat(exportDirView, "/view");
  strcpy(general_settings_view.export_dir, exportDirView);

  CUVIS_EXPORT_CUBE_SETTINGS cube_settings_session = {
      0, 1, 0, 1, 1, OperationMode_Software, 1.0, 64, 128, 60000};
  CUVIS_EXPORT_GENERAL_SETTINGS general_settings_session = {
      "", //initializer list only takes const char*, leave empty and modify afterwards.
      "all",
      1,
      0.0,
      pan_sharpening_interpolation_type_NearestNeighbor,
      pan_sharpening_algorithm_Noop,
      0,
      0};
  char exportDirSession[CUVIS_MAXBUF];
  strcpy(exportDirSession, exportDir);
  strcat(exportDirSession, "/session");
  strcpy(general_settings_session.export_dir, exportDirSession);

  printf("loading session ...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_session_file_load(sessionLoc, &sess));

  printf("loading measurement ...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_session_file_get_mesu(
      sess, 0, session_item_type_frames_no_gaps, &mesu));

  printf("creating envi exporter ...\n");
  fflush(stdout);
  CUVIS_CHECK(
      cuvis_exporter_create_envi(&envi_exporter, general_settings_envi));
  printf(" done.\n");
  fflush(stdout);

  printf("creating single tiff exporter ...\n");
  fflush(stdout);

  single_tiff_settings.compression_mode = tiff_compression_mode_None;
  single_tiff_settings.format = tiff_format_Single;
  CUVIS_CHECK(cuvis_exporter_create_tiff(
      &single_tiff_exporter, general_settings_single, single_tiff_settings));
  printf(" done.\n");
  fflush(stdout);

  printf("creating multi tiff exporter ...\n");
  fflush(stdout);

  multi_tiff_settings.compression_mode = tiff_compression_mode_None;
  multi_tiff_settings.format = tiff_format_MultiChannel;
  CUVIS_CHECK(cuvis_exporter_create_tiff(
      &multi_tiff_exporter, general_settings_multi, multi_tiff_settings));
  printf(" done.\n");
  fflush(stdout);

  printf("creating view exporter ...\n");
  printf("loading plugin ...\n");
  fflush(stdout);

  f = fopen(pluginLoc, "rb");

  if (f)
  {
    fseek(f, 0, SEEK_END);
    length = ftell(f);
    fseek(f, 0, SEEK_SET);
    buffer = malloc(length);
    if (buffer)
    {
      fread(buffer, 1, length, f);
    }
    fclose(f);
  }
  if (!buffer)
  {
    printf("failed to load plugin file\n");
    fflush(stdout);

    return 0;
  }

  view_settings.userplugin = buffer;
  CUVIS_CHECK(cuvis_exporter_create_view(
      &view_exporter, general_settings_view, view_settings));
  printf(" done.\n");
  fflush(stdout);

  printf("creating cube exporter (session) ...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_exporter_create_cube(
      &cube_exporter, general_settings_session, cube_settings_session));
  printf(" done.\n");
  fflush(stdout);

  printf("export envi...");
  fflush(stdout);

  CUVIS_CHECK(cuvis_exporter_apply(envi_exporter, mesu));
  printf(" done.\n");
  fflush(stdout);

  printf("export single tiff...");
  fflush(stdout);
  CUVIS_CHECK(cuvis_exporter_apply(single_tiff_exporter, mesu));
  printf(" done.\n");
  fflush(stdout);

  printf("export multi tiff...");
  fflush(stdout);

  CUVIS_CHECK(cuvis_exporter_apply(multi_tiff_exporter, mesu));
  printf(" done.\n");
  fflush(stdout);

  printf("export view...");
  fflush(stdout);

  CUVIS_CHECK(cuvis_exporter_apply(view_exporter, mesu));
  printf("done.\n");
  fflush(stdout);

  printf("export cube (session)...");
  fflush(stdout);

  CUVIS_CHECK(cuvis_exporter_apply(cube_exporter, mesu));
  printf("done.\n");
  fflush(stdout);

  cuvis_measurement_free(&mesu);
  cuvis_session_file_free(&sess);
  cuvis_exporter_free(&envi_exporter);
  cuvis_exporter_free(&single_tiff_exporter);
  cuvis_exporter_free(&multi_tiff_exporter);
  cuvis_exporter_free(&view_exporter);
  cuvis_exporter_free(&cube_exporter);
  cuvis_shutdown();

  free(buffer);
  printf("finished.\n");
  fflush(stdout);

  return 0;
}

Changing the Distance of a Measurement

This example demonstrates how to update the distance parameter in hyperspectral measurement data using the cuvis SDK.

#include "cuvis.h"

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  if (argc != 5)
  {
    printf("To few Arguments! Please provide:\n");
    printf("user settings directory\n");
    printf("sessionfile (.cu3s)\n");
    printf("new distance\n");
    printf("Name of export directory\n");
    fflush(stdout);

    return -1;
  }

  char* const userSettingsDir = argv[1];
  char* const sessionLoc = argv[2];
  char* const distanceString = argv[3];
  char* const exportDir = argv[4];

  int distance = atoi(distanceString); //in mm

  printf("Example 04 change distance cpp \n");
  printf(userSettingsDir);
  printf("\nsessionfile (.cu3s): ");
  printf(sessionLoc);
  printf("\nNew Distance: %d\n", distance);
  printf("Export Dir: ");
  printf(exportDir);
  fflush(stdout);

  CUVIS_SESSION_FILE sess;

  CUVIS_MESU mesu;
  CUVIS_MESU_METADATA mesu_data;

  CUVIS_PROC_CONT procCont;

  CUVIS_INT is_capable;

  printf("\nloading settings... \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_init(userSettingsDir, loglevel_debug));
#ifdef _DEBUG
  CUVIS_CHECK(cuvis_set_log_level(loglevel_debug));
#else
  CUVIS_CHECK(cuvis_set_log_level(loglevel_info));
#endif

  printf("\nloading session... \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_session_file_load(sessionLoc, &sess));

  printf("\nloading measurement... \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_session_file_get_mesu(
      sess, 0, session_item_type_frames_no_gaps, &mesu));

  CUVIS_CHECK(cuvis_measurement_get_metadata(mesu, &mesu_data));
  printf(
      "data 1 %s %.2f ms mode=%d flags=%d\n",
      mesu_data.name,
      mesu_data.integration_time,
      mesu_data.processing_mode,
      mesu_data.measurement_flags);
  fflush(stdout);

  printf("Load calibration and processing context...");
  fflush(stdout);
  CUVIS_CHECK(cuvis_proc_cont_create_from_session_file(sess, &procCont));
  printf(" done. \n");
  fflush(stdout);

  printf("prepare saving of measurements... \n");
  fflush(stdout);
  CUVIS_EXPORTER cube_exporter;

  CUVIS_EXPORT_GENERAL_SETTINGS general_settings = {
      "", //initializer list only takes const char*, leave empty and modify afterwards.
      "all",
      1,
      0.0,
      pan_sharpening_interpolation_type_NearestNeighbor,
      pan_sharpening_algorithm_Noop,
      0,
      0};

  strcpy(general_settings.export_dir, exportDir);

  CUVIS_EXPORT_CUBE_SETTINGS cube_settings;
  cube_settings.allow_fragmentation = 0;
  cube_settings.allow_overwrite = 1;
  cube_settings.allow_session_file = 1;

  cuvis_exporter_create_cube(&cube_exporter, general_settings, cube_settings);

  printf("Set distance ...");
  fflush(stdout);
  //CUVIS_CHECK(cuvis_proc_cont_calc_distance(procCont, distance)); // throws error on pan image
  cuvis_proc_cont_calc_distance(procCont, distance);
  printf(" done. \n");
  fflush(stdout);

  CUVIS_PROC_ARGS args;
  args.processing_mode = Cube_Raw;

  CUVIS_CHECK(cuvis_proc_cont_is_capable(procCont, mesu, args, &is_capable));

  if (1 == is_capable)
  {
    printf("reprocess measurement to Cube_Raw with custom distance mode...");
    fflush(stdout);

    CUVIS_CHECK(cuvis_proc_cont_set_args(procCont, args));
    CUVIS_CHECK(cuvis_proc_cont_apply(procCont, mesu));
    printf(" done. \n");
    fflush(stdout);

    CUVIS_CHECK(cuvis_measurement_get_metadata(mesu, &mesu_data));
    printf(
        "data 1 %s %.2f ms mode=%d flags=%d\n",
        mesu_data.name,
        mesu_data.integration_time,
        mesu_data.processing_mode,
        mesu_data.measurement_flags);
    fflush(stdout);

    cuvis_exporter_apply(cube_exporter, mesu);
  }
  else
  {
    printf("Cannot process to Cube_Raw mode.\n");
    fflush(stdout);
  }

  cuvis_exporter_free(&cube_exporter);
  cuvis_proc_cont_free(&procCont);
  cuvis_measurement_free(&mesu);
  cuvis_shutdown();
  printf("finished.");
  fflush(stdout);
}

Recording single Measurements

This example demonstrates how to capture single hyperspectral images using the cuvis SDK, with user-defined settings and parameters.

#include "cuvis.h"

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

#ifdef WIN32
  #include <Windows.h>
#else
  #include <unistd.h>
#endif

int main(int argc, char* argv[])
{
  if (argc != 6)
  {
    printf("To few Arguments! Please provide:\n");
    printf("user settings directory\n");
    printf("factory directory\n");
    printf("path of recording directory\n");
    printf("exposure time in ms\n");
    printf("number of images\n");
    return -1;
  }

  char* const userSettingsDir = argv[1];
  char* const factoryDir = argv[2];
  char* const recDir = argv[3];
  char* const exposureString = argv[4]; //in ms
  char* const nrImagesString = argv[5];

  int exposure_ms = atoi(exposureString);
  int nrImages = atoi(nrImagesString);

  printf("Example 05 record single image\n");
  printf("User Settings directory: ");
  printf(userSettingsDir);
  printf("\nFactory directory: ");
  printf(factoryDir);
  printf("\nRecording directory: ");
  printf(recDir);
  printf("\nExposure in ms: %d\n", exposure_ms);
  printf("Number of images: %d\n", nrImages);

  CUVIS_CALIB calib;
  CUVIS_ACQ_CONT acqCont;
  CUVIS_PROC_CONT procCont;

  printf("load user settings...\n");
  CUVIS_CHECK(cuvis_init(userSettingsDir, loglevel_debug));
  cuvis_set_log_level(loglevel_info);

  printf("load calibration...\n");
  CUVIS_CHECK(cuvis_calib_create_from_path(factoryDir, &calib));

  printf("initialize processing context...\n");
  CUVIS_CHECK(cuvis_proc_cont_create_from_calib(calib, &procCont));

  printf("initialize acquisition context...\n");
  CUVIS_CHECK(cuvis_acq_cont_create_from_calib(calib, &acqCont));

  printf("initialize measurement exporter...\n");
  CUVIS_EXPORTER cube_exporter;

  // Export settings: General processing of measurements
  CUVIS_EXPORT_GENERAL_SETTINGS general_settings = {
      "", //initializer list only takes const char*, leave empty and modify afterwards.
      "all",
      1,
      0.0,
      pan_sharpening_interpolation_type_NearestNeighbor,
      pan_sharpening_algorithm_Noop,
      0,
      0};

  strcpy(general_settings.export_dir, recDir);

  // Cube exporter specific settings
  CUVIS_EXPORT_CUBE_SETTINGS cube_settings;
  cube_settings.allow_fragmentation = 0;
  cube_settings.allow_overwrite = 1;
  cube_settings.allow_session_file = 1;
  cube_settings.allow_info_file = 1;
  cube_settings.hard_limit = 4;
  cube_settings.soft_limit = 2;

  // Settings for worker (processing pipeline)
  CUVIS_WORKER_SETTINGS worker_settings;
  worker_settings.can_drop_results = 0;
  worker_settings.can_skip_measurements = 0;
  worker_settings.can_skip_supplementary_steps = 0;
  worker_settings.input_queue_size = 10;
  worker_settings.output_queue_size = 5;
  worker_settings.mandatory_queue_size = 2;
  worker_settings.supplementary_queue_size = 2;

  cuvis_exporter_create_cube(&cube_exporter, general_settings, cube_settings);

  printf("initialize processing pipeline worker...\n");
  CUVIS_WORKER worker;
  cuvis_worker_create(&worker, worker_settings);

  CUVIS_PROC_ARGS procArgs;
  procArgs.allow_recalib = 0;
  procArgs.processing_mode = Cube_Raw;

  printf("waiting for camera to become online...\n");
  while (1)
  {
    CUVIS_HARDWARE_STATE state;
    cuvis_acq_cont_get_state(acqCont, &state);

    if (state == hardware_state_online)
    {
      printf("\ncamera online\n");
      break;
    }
    if (state == hardware_state_partially_online)
    {
      printf("\ncamera partially online\n");
      break;
    }

#ifdef WIN32
    Sleep(1000);
#else
    usleep(1000000);
#endif
    printf(".");
    fflush(stdout);
  }

  printf("camera components details:\n");
  CUVIS_INT compCount;
  CUVIS_CHECK(cuvis_acq_cont_get_component_count(acqCont, &compCount));
  for (int compIdx = 0; compIdx < compCount; compIdx++)
  {
    CUVIS_INT online;
    CUVIS_COMPONENT_INFO cinfo;

    CUVIS_CHECK(cuvis_acq_cont_get_component_info(acqCont, compIdx, &cinfo));
    CUVIS_CHECK(cuvis_comp_online_get(acqCont, compIdx, &online));
    printf(" - component '%s' is ", cinfo.displayname);
    if (online != 0)
    {
      printf("online\n");
    }
    else
    {
      printf("offline\n");
    }
    printf(" -- info:        %s\n", cinfo.sensorinfo);
    printf(" -- use:         %s\n", cinfo.userfield);
    printf(" -- pixelformat: %s\n", cinfo.pixelformat);
  }

  printf("configuring camera components...\n");
  // Configure exposure / integration time and software trigger
  CUVIS_CHECK(cuvis_acq_cont_integration_time_set(acqCont, exposure_ms));
  CUVIS_CHECK(cuvis_acq_cont_operation_mode_set(acqCont, OperationMode_Software));

  // Assign contexts to worker
  CUVIS_CHECK(cuvis_worker_set_acq_cont(worker, acqCont));
  CUVIS_CHECK(cuvis_worker_set_proc_cont(worker, procCont));
  CUVIS_CHECK(cuvis_worker_set_exporter(worker, cube_exporter));

  printf("start recording now\n");
  CUVIS_CHECK(cuvis_worker_start(worker));

  for (int k = 0; k < nrImages; k++)
  {
    printf("trigger image nr. %d/%d\n", k + 1, nrImages);
    CUVIS_CHECK(cuvis_acq_cont_capture_async(acqCont, NULL));

    printf("waiting for processing...\n");
    CUVIS_CHECK(cuvis_worker_get_next_result(worker, NULL, NULL, exposure_ms + 2000));
  }
  CUVIS_CHECK(cuvis_worker_stop(worker));
  printf("done. cleaning up...\n");

  cuvis_exporter_free(&cube_exporter);
  cuvis_proc_cont_free(&procCont);
  cuvis_acq_cont_free(&acqCont);
  cuvis_calib_free(&calib);
  cuvis_worker_free(&worker);

  cuvis_shutdown();
  printf("finished.\n");
}

Recording a video

This example demonstrates how to record a video sequence of hyperspectral data using the cuvis SDK.

#include "cuvis.h"

#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

#ifdef WIN32
  #include <Windows.h>
#else
  #include <unistd.h>
#endif

int keepRunning = 1;

void signal_handler(int sig)
{
  printf("\nsignal received. Stopping acquisiton...\n");
  fflush(stdout);
  (void)sig;
  keepRunning = 0;
}

int main(int argc, char* argv[])
{
  if (argc != 7)
  {
    printf("To few Arguments! Please provide:\n");
    printf("user settings directory\n");
    printf("factory directory\n");
    printf("name of recording directory\n");
    printf("exposure time in ms\n");
    printf("auto exposure [1/0]\n");
    printf("target fps\n");
    fflush(stdout);

    return -1;
  }

  char* const userSettingsDir = argv[1];
  char* const factoryDir = argv[2];
  char* const recDir = argv[3];
  char* const exposureString = argv[4];
  char* const autoExpString = argv[5];
  char* const fpsString = argv[6];

  int exposure_ms = atoi(exposureString); //in ms
  bool autoExp = false;
  if (atoi(autoExpString) == 1)
  {
    autoExp = true;
  }
  double fps = atof(fpsString);

  printf("Example 06 video");
  printf("\nUser Settings Dir: ");
  printf(userSettingsDir);
  printf("\nFactory Dir: ");
  printf(factoryDir);
  printf("\nRecording Dir: ");
  printf(recDir);
  printf("\nExposure in ms: %d\n", exposure_ms);
  printf("Auto Exposure: %d\n", autoExp);
  printf("Target FPS: %4.2f\n", fps);
  fflush(stdout);

  CUVIS_CALIB calib;
  CUVIS_ACQ_CONT acqCont;
  CUVIS_PROC_CONT procCont;

  printf("loading user settings...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_init(userSettingsDir, loglevel_debug));

  printf("loading calibration...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_calib_create_from_path(factoryDir, &calib));

  printf("loading acquisition context... \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_acq_cont_create_from_calib(calib, &acqCont));

  printf("load processing context \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_proc_cont_create_from_calib(calib, &procCont));

  printf("prepare saving of measurements... \n");
  fflush(stdout);
  CUVIS_EXPORTER cube_exporter;

  CUVIS_EXPORT_GENERAL_SETTINGS general_settings = {
      "", //initializer list only takes const char*, leave empty and modify afterwards.
      "all",
      1,
      0.0,
      pan_sharpening_interpolation_type_NearestNeighbor,
      pan_sharpening_algorithm_Noop,
      0,
      0};
  strcpy(general_settings.export_dir, recDir);

  CUVIS_EXPORT_CUBE_SETTINGS cube_settings;
  cube_settings.allow_fragmentation = 0;
  cube_settings.allow_overwrite = 1;
  cube_settings.allow_session_file = 1;
  cube_settings.fps = fps;
  cube_settings.operation_mode = OperationMode_Internal;
  cube_settings.allow_info_file = 1;
  cube_settings.hard_limit = 4;
  cube_settings.soft_limit = 2;


  CUVIS_CHECK(cuvis_exporter_create_cube(
      &cube_exporter, general_settings, cube_settings));

  CUVIS_PROC_ARGS procArgs;
  procArgs.allow_recalib = 0;
  procArgs.processing_mode = Cube_Raw;

  CUVIS_SESSION_INFO sess = {"video", 0, 0};
  CUVIS_CHECK(cuvis_acq_cont_set_session_info(acqCont, &sess));

  printf("waiting for camera to become online...\n");
  fflush(stdout);

  for (;;)
  {
    CUVIS_HARDWARE_STATE state;
    CUVIS_CHECK(cuvis_acq_cont_get_state(acqCont, &state));

    if (state == hardware_state_online)
    {
      printf("\ncamera online\n");
      fflush(stdout);

      break;
    }
    if (state == hardware_state_partially_online)
    {
      printf("\ncamera partially online\n");
      fflush(stdout);

      break;
    }

#ifdef WIN32
    Sleep(1000);
#else
    usleep(1000000);
#endif

    printf(".");
  }

  printf("component details:\n");
  fflush(stdout);

  CUVIS_INT compCount;
  CUVIS_CHECK(cuvis_acq_cont_get_component_count(acqCont, &compCount));
  for (int compIdx = 0; compIdx < compCount; compIdx++)
  {
    CUVIS_INT online;
    CUVIS_COMPONENT_INFO cinfo;

    CUVIS_CHECK(cuvis_acq_cont_get_component_info(acqCont, compIdx, &cinfo));
    CUVIS_CHECK(cuvis_comp_online_get(acqCont, compIdx, &online));
    printf(" - component '%s' is ", cinfo.displayname);
    fflush(stdout);

    if (online != 0)
    {
      printf("online\n");
      fflush(stdout);
    }
    else
    {
      printf("offline\n");
      fflush(stdout);
    }
    printf(" -- info:        %s\n", cinfo.sensorinfo);
    printf(" -- use:         %s\n", cinfo.userfield);
    printf(" -- pixelformat: %s\n", cinfo.pixelformat);
    fflush(stdout);
  }

  printf("initializing hardware...\n");
  fflush(stdout);

  CUVIS_CHECK(cuvis_acq_cont_integration_time_set(acqCont, exposure_ms));
  CUVIS_CHECK(
      cuvis_acq_cont_operation_mode_set(acqCont, OperationMode_Internal));
  CUVIS_CHECK(cuvis_acq_cont_fps_set(acqCont, fps));
  CUVIS_CHECK(cuvis_acq_cont_queue_size_set(acqCont, 10));
  CUVIS_CHECK(cuvis_acq_cont_continuous_set(acqCont, 0));
  CUVIS_CHECK(cuvis_proc_cont_set_args(procCont, procArgs));

  cuvis_acq_cont_binning_set(acqCont, 1);
  CUVIS_WORKER worker;
  CUVIS_WORKER_SETTINGS worker_settings;
  worker_settings.can_skip_measurements = 0;       // Worker cannot skip exporting measurements
  worker_settings.can_skip_supplementary_steps = 1; // Worker can skip view generation
  worker_settings.can_drop_results = 1;             // Worker can drop results from the output queue, if it is full
  worker_settings.input_queue_size = 10;
  worker_settings.output_queue_size = 5;
  worker_settings.mandatory_queue_size = 2;
  worker_settings.supplementary_queue_size = 2;
  cuvis_worker_create(&worker, worker_settings);

  cuvis_worker_set_acq_cont(worker, acqCont);
  cuvis_worker_set_proc_cont(worker, procCont);
  cuvis_worker_set_exporter(worker, cube_exporter);

  printf("registering signal for CTRL+c (cancel recording) \n");
  fflush(stdout);
  signal(SIGINT, signal_handler);

  printf("recording...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_acq_cont_continuous_set(acqCont, 1));
  CUVIS_CHECK(cuvis_worker_start(worker));

  CUVIS_INT used_queue;
  CUVIS_INT queue_limit;

  while (0 != keepRunning)
  {
    CUVIS_MESU mesu = 0;


    queue_limit = 4;
    cuvis_worker_get_threads_busy(worker, &used_queue);
    if (used_queue == queue_limit)
    {
      printf("Worker queue is full! Main() loop can not keep up!");
      fflush(stdout);
    }

    cuvis_acq_cont_queue_size_get(acqCont, &used_queue);
    cuvis_acq_cont_queue_used_get(acqCont, &used_queue);
    if (used_queue == queue_limit)
    {
      printf("Acquisition queue is full! Worker can not keep up!");
      fflush(stdout);
    }

    CUVIS_STATUS ret;
    ret = cuvis_worker_get_next_result(worker, &mesu, NULL, exposure_ms + 200);
    if (ret == status_not_available) {
      printf("Worker has no measurement ready yet...");
    }
    else if (ret != status_ok)
    {
      printf("Worker error, details: %s\n", cuvis_get_last_error_msg());
      fflush(stdout);
    }

    if (mesu)
    {
      CUVIS_MESU_METADATA mesu_data;
      CUVIS_CHECK(cuvis_measurement_get_metadata(mesu, &mesu_data));
      printf(
          "\rcurrent handle index: %04d", mesu_data.session_info_sequence_no);
      fflush(stdout);

      cuvis_measurement_free(&mesu);
    }
  }
  signal(SIGINT, SIG_DFL);

  printf("cleaning up\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_acq_cont_continuous_set(acqCont, 0));
  CUVIS_CHECK(cuvis_worker_stop(worker));
  CUVIS_CHECK(cuvis_worker_drop_all_queued(worker));
  cuvis_worker_free(&worker);
  cuvis_exporter_free(&cube_exporter);
  cuvis_acq_cont_free(&acqCont);
  cuvis_proc_cont_free(&procCont);
  cuvis_calib_free(&calib);

  cuvis_shutdown();
  printf("finished \n");
  fflush(stdout);
}

Rerecording a video from already recorded data

This example demonstrates how to simulate recording a hyperspectral video sequence using data from a pre-existing session file. It replicates the process of live video recording without requiring an actual camera.

#include "cuvis.h"

#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

#ifdef WIN32
  #include <Windows.h>
#else
  #include <unistd.h>
#endif

int keepRunning = 1;

void signal_handler(int sig)
{
  printf("\nsignal received. Stopping acquisiton...\n");
  fflush(stdout);
  (void)sig;
  keepRunning = 0;
}

int main(int argc, char* argv[])
{
  if (argc != 7)
  {
    printf("To few Arguments! Please provide:\n");
    printf("user settings directory\n");
    printf("sessionfile\n");
    printf("name of recording directory\n");
    printf("exposure time in ms\n");
    printf("auto exposure [1/0]\n");
    printf("target fps\n");
    fflush(stdout);

    return -1;
  }

  char* const userSettingsDir = argv[1];
  char* const sessionfile = argv[2];
  char* const recDir = argv[3];
  char* const exposureString = argv[4]; //in ms
  char* const autoExpString = argv[5];
  char* const fpsString = argv[6];

  int exposure_ms = atoi(exposureString); //in ms
  bool autoExp = false;
  if (atoi(autoExpString) == 1)
  {
    autoExp = true;
  }
  double fps = atof(fpsString);

  printf("Example 06 video");
  printf("\nUser Settings Dir: ");
  printf(userSettingsDir);
  printf("\nSessionfile: ");
  printf(sessionfile);
  printf("\nRecording Dir: ");
  printf(recDir);
  printf("\nExposure in ms: %d\n", exposure_ms);
  printf("Auto Exposure: %d\n", autoExp);
  printf("Target FPS: %4.2f\n", fps);
  fflush(stdout);

  CUVIS_SESSION_FILE sessFile;
  CUVIS_ACQ_CONT acqCont;
  CUVIS_PROC_CONT procCont;

  printf("loading user settings...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_init(userSettingsDir, loglevel_debug));

  printf("loading session file... \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_session_file_load(sessionfile, &sessFile));

  printf("loading acquisition context... \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_acq_cont_create_from_session_file(sessFile, 1,
                                                      &acqCont)); // simulating = true --> use frames from sessionfile instead of real camera

  printf("load processing context \n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_proc_cont_create_from_session_file(sessFile, &procCont));

  printf("prepare saving of measurements... \n");
  fflush(stdout);

  CUVIS_EXPORTER cube_exporter;

  CUVIS_EXPORT_GENERAL_SETTINGS general_settings = {
      "", //initializer list only takes const char*, leave empty and modify afterwards.
      "all",
      1,
      0.0,
      pan_sharpening_interpolation_type_NearestNeighbor,
      pan_sharpening_algorithm_Noop,
      0,
      0};
  strcpy(general_settings.export_dir, recDir);

  CUVIS_EXPORT_CUBE_SETTINGS cube_settings;
  cube_settings.allow_fragmentation = 0;
  cube_settings.allow_overwrite = 1;
  cube_settings.allow_session_file = 1;
  cube_settings.fps = fps;
  cube_settings.operation_mode = OperationMode_Internal;
  cube_settings.allow_info_file = 1;

  CUVIS_CHECK(cuvis_exporter_create_cube(&cube_exporter, general_settings, cube_settings));

  CUVIS_PROC_ARGS procArgs;
  procArgs.allow_recalib = 0;
  procArgs.processing_mode = Cube_Raw;

  CUVIS_SESSION_INFO sess = {"video", 0, 0};
  CUVIS_CHECK(cuvis_acq_cont_set_session_info(acqCont, &sess));

  printf("waiting for simulated camera to become ready...\n");
  fflush(stdout);
  for (;;)
  {
    CUVIS_HARDWARE_STATE state;
    CUVIS_CHECK(cuvis_acq_cont_get_state(acqCont, &state));

    if (state == hardware_state_online)
    {
      printf("\ncamera online\n");
      fflush(stdout);

      break;
    }
    if (state == hardware_state_partially_online)
    {
      printf("\ncamera partially online\n");
      fflush(stdout);

      break;
    }
#ifdef WIN32
    Sleep(1000);
#else
    usleep(1000000);
#endif
    printf(".");
  }

  printf("component details:\n");
  fflush(stdout);
  CUVIS_INT compCount;
  CUVIS_CHECK(cuvis_acq_cont_get_component_count(acqCont, &compCount));
  for (int compIdx = 0; compIdx < compCount; compIdx++)
  {
    CUVIS_INT online;
    CUVIS_COMPONENT_INFO cinfo;

    CUVIS_CHECK(cuvis_acq_cont_get_component_info(acqCont, compIdx, &cinfo));
    CUVIS_CHECK(cuvis_comp_online_get(acqCont, compIdx, &online));
    printf(" - component '%s' is ", cinfo.displayname);
    fflush(stdout);

    if (online != 0)
    {
      printf("online\n");
      fflush(stdout);
    }
    else
    {
      printf("offline\n");
      fflush(stdout);
    }
    printf(" -- info:        %s\n", cinfo.sensorinfo);
    printf(" -- use:         %s\n", cinfo.userfield);
    printf(" -- pixelformat: %s\n", cinfo.pixelformat);
    fflush(stdout);
  }

  printf("initializing hardware...\n");
  fflush(stdout);

  CUVIS_CHECK(cuvis_acq_cont_integration_time_set(acqCont, 100));
  CUVIS_CHECK(cuvis_acq_cont_operation_mode_set(acqCont, OperationMode_Internal));
  CUVIS_CHECK(cuvis_acq_cont_fps_set(acqCont, fps));
  CUVIS_CHECK(cuvis_acq_cont_queue_size_set(acqCont, 10));
  CUVIS_CHECK(cuvis_acq_cont_continuous_set(acqCont, 0));
  CUVIS_CHECK(cuvis_proc_cont_set_args(procCont, procArgs));

  cuvis_acq_cont_binning_set(acqCont, 1);
  CUVIS_WORKER worker;
  CUVIS_WORKER_SETTINGS worker_settings;
  worker_settings.can_skip_measurements = 0;        // Worker cannot skip exporting measurements
  worker_settings.can_skip_supplementary_steps = 1; // Worker can skip view generation
  worker_settings.can_drop_results = 1;             // Worker can drop results from the output queue, if it is full
  worker_settings.input_queue_size = 10;
  worker_settings.output_queue_size = 5;
  worker_settings.mandatory_queue_size = 2;
  worker_settings.supplementary_queue_size = 2;
  cuvis_worker_create(&worker, worker_settings);

  cuvis_worker_set_acq_cont(worker, acqCont);
  cuvis_worker_set_proc_cont(worker, procCont);
  cuvis_worker_set_exporter(worker, cube_exporter);

  printf("registering signal for CTRL+c (cancel recording) \n");
  fflush(stdout);
  signal(SIGINT, signal_handler);

  printf("recording...\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_acq_cont_continuous_set(acqCont, 1));
  CUVIS_CHECK(cuvis_worker_start(worker));
  

  CUVIS_INT used_queue;
  CUVIS_INT queue_limit;

  while (0 != keepRunning)
  {
    CUVIS_MESU mesu = 0;

    queue_limit = worker_settings.mandatory_queue_size + worker_settings.supplementary_queue_size;
    cuvis_worker_get_threads_busy(worker, &used_queue);
    if (used_queue == queue_limit)
    {
      printf("Worker queue is full! Main() loop can not keep up!");
      fflush(stdout);
    }

    cuvis_acq_cont_queue_size_get(acqCont, &used_queue);
    cuvis_acq_cont_queue_used_get(acqCont, &used_queue);
    if (used_queue == queue_limit)
    {
      printf("Acquisition queue is full! Worker can not keep up!");
      fflush(stdout);
    }

    CUVIS_STATUS ret = cuvis_worker_get_next_result(acqCont, &mesu, NULL, 1000);
    if (ret == status_not_available)
    {
      printf("Worker has no measurement ready yet...");
    }
    else if (ret != status_ok)
    {
      printf("Worker error, details: %s\n", cuvis_get_last_error_msg());
      fflush(stdout);
    }

    if (mesu)
    {
      CUVIS_MESU_METADATA mesu_data;
      CUVIS_CHECK(cuvis_measurement_get_metadata(mesu, &mesu_data));
      printf("\rcurrent handle index: %04d", mesu_data.session_info_sequence_no);
      fflush(stdout);

      cuvis_measurement_free(&mesu);
    }
  }
  signal(SIGINT, SIG_DFL);

  printf("cleaning up\n");
  fflush(stdout);
  CUVIS_CHECK(cuvis_acq_cont_continuous_set(acqCont, 0));
  CUVIS_CHECK(cuvis_worker_stop(worker));
  CUVIS_CHECK(cuvis_worker_drop_all_queued(worker));
  cuvis_worker_free(&worker);
  cuvis_exporter_free(&cube_exporter);
  cuvis_acq_cont_free(&acqCont);
  cuvis_proc_cont_free(&procCont);
  cuvis_session_file_free(&sessFile);

  cuvis_shutdown();
  printf("finished \n");
  fflush(stdout);
}

Applying Pan-Sharpening to recorded Data

This example demonstrates how to apply Pan-Sharpening on recorded data. For this to work the camera needs an additional pan-sensor.

import os
import platform
from pathlib import Path
import time

import cuvis
import tifffile

def run_example_pansharpening(userSettingsDir,
                              measurementLoc,
                              panToCube,
                              panScale,
                              exportDir):
    
    print("loading user settings...")
    cuvis.init(userSettingsDir)
    cuvis.set_log_level("info")

    print("loading session file...")
    session = cuvis.SessionFile(measurementLoc)
    mesu = session[0]
    assert mesu._handle

    if 'pan' not in mesu.data.keys():
        raise ValueError('The measurement does not contain a Pan Image.')

    # settings pansharpening
    '''
    cuvis.PansharpeningAlgorithm:
    Defines, which algorithm is used to calculate the pansharpened image. Available options are:
    - Noop:
        "dummy" algorithm, only applies scaling.
    - CubertMacroPixel:
        Generates intensity scaling values for the spectral data from the panimage. Can operate without
        reference measurements.
    - CubertPanRatio:
        Preferred algorithm for reflectance measurements. The measurement's and white calibration's panimages
        are used to generate the panratio (or „panchromatic reflectance“ image). The panratio is then applied
        to the hyperspectral cube to scale the intensity of the spectra without changing their shape. 
    - AlphaBlendOverlay:
        Technically not a pan-sharpening algorithm. Quick workaround to display correlation results on top of
        the pan image using an opacity value selected by the user.
    '''
    panAlgo = cuvis.PanSharpeningAlgorithm.CubertPanRatio # algorithm for pansharpening

    '''
    cuvis.PanSharpeningInterpolationType:
    This setting controls which conventional algorithm is utilized for upscaling the hyperspectral data cube.
    Available options are: Nearest Neighbor, Linear, Cubic and Lanczos
    '''
    panInterp = cuvis.PanSharpeningInterpolationType.Cubic # interpolation method
    
    multi_tiff_settings = cuvis.TiffExportSettings(
        export_dir = str(exportDir),
        format = cuvis.TiffFormat.MultiChannel,
        pan_sharpening_algorithm = panAlgo,
        pan_sharpening_interpolation_type = panInterp, 
        pan_scale = panScale,
        add_pan = panToCube 
        )

    print("size before pansharpening: ", mesu.cube.width, "x", mesu.cube.height, "x", mesu.cube.channels)
    print("Pansharpening and tiff export in progress...")

    multiTiffExporter = cuvis.TiffExporter(multi_tiff_settings)
    multiTiffExporter.apply(mesu) 

    time.sleep(5)

    exportPath= Path(exportDir) / "x20p_flight_data_0000_raw.tiff"
    pansharpened_mesu = tifffile.imread(str(exportPath))
    
    print("size after pansharpening: ", pansharpened_mesu.shape[0], "x", pansharpened_mesu.shape[1], "x", pansharpened_mesu.shape[2] )
    print("algorithm used:", str(panAlgo).split('.')[-1])
    print("Interpolation method used:", str(panInterp).split('.')[-1])
    print("Pansharpening amount:", panScale)
    print("Panimage saved as 0th channel:", panToCube)

    cuvis.shutdown()
    print("finished.")


if __name__ == "__main__":
     
    if platform.system() == "Windows":
        data_dir = Path(os.getenv("CUVIS")).parent / "sdk" / \
            "sample_data" / "set_examples"

    elif platform.system() == "Linux":
        data_dir = Path(os.getenv("CUVIS_DATA")) / \
            "sample_data" / "set_examples"
        
    loc_file = data_dir / "set2_x20p_flight_data" / "x20p_flight_data.cu3s"
    loc_settings = data_dir / "settings"

    pan_to_cube = True
    pan_size = 1

    loc_output = Path(os.getcwd()) / "EX08_pansharpened_measurement"

    print("Example 08: Pansharpen X20 Plus measurement. Please provide:")

    userSettingsDir = input(
        "User settings directory (default: {}): ".format(loc_settings))
    if userSettingsDir.strip().lower() in ["", "default"]:
        userSettingsDir = loc_settings

    measurementLoc = input(
        "Measurement file (.cu3s) (default: {}): ".format(loc_file))
    if measurementLoc.strip().lower() in ["", "default"]:
        measurementLoc = loc_file

    panToCube = input(
        "Save panimage as 0th channel - True/False? (default: {}): ".format(pan_to_cube))
    if panToCube.lower() in ["", "default"]:
        panToCube = pan_to_cube  # use the default boolean value
    elif panToCube.lower() == "true":
        panToCube = True
    elif panToCube.lower() == "false":
        panToCube = False
    else:
        raise ValueError("Invalid input. Please enter True or False.")
    
    panScale = input(
        "Define the amount of pansharpening between 0 and 1 in respect to the size of the panimage (default: {}): ".format(pan_size))
    if panScale.strip().lower() in ["", "default"]:
        panScale = pan_size

    exportDir = input(
        "Name of export directory (default: {}): ".format(loc_output))
    if exportDir.strip().lower() in ["", "default"]:
        exportDir = loc_output

    
    run_example_pansharpening(str(userSettingsDir), str(measurementLoc), panToCube, panScale, exportDir)