Ejemplo n.º 1
0
t_vol		*init_get_volume_from_minc_file(char *path)
{
  t_vol		*volume;
  int		result;

  volume = malloc(sizeof(*volume));
  volume->path = path;
  volume->dim_nb = 3;
  if (volume->path == NULL)
    return (NULL);
  // open the minc file
  if ((result = miopen_volume(volume->path, MI2_OPEN_READ, &volume->minc_volume)) != MI_NOERROR)
    {
      fprintf(stderr, "Error opening input file: %d.\n", result);
      return (NULL);
    }

  if ((result = miget_volume_dimension_count(volume->minc_volume, 0, 0, &volume->dim_nb)) != MI_NOERROR)
    {
      fprintf(stderr, "Error getting number of dimensions: %d.\n", result);
      return (NULL);
    }

  volume->dimensions = malloc(volume->dim_nb * sizeof(*volume->dimensions));
  volume->starts = malloc(volume->dim_nb * sizeof(*volume->starts));
  volume->steps = malloc(volume->dim_nb * sizeof(*volume->steps));
  volume->size = malloc(volume->dim_nb * sizeof(*volume->size));
  volume->dim_name = malloc(volume->dim_nb * sizeof(*volume->dim_name));

  // get the volume dimensions
  if ((result = miget_volume_dimensions(volume->minc_volume, MI_DIMCLASS_SPATIAL, MI_DIMATTR_ALL,
					MI_DIMORDER_FILE, volume->dim_nb, volume->dimensions)) == MI_ERROR)
    {
      fprintf(stderr, "Error getting dimensions: %d.\n", result);
      return (NULL);
    }
  // get the size of each dimensions

  if ((result = miget_dimension_size(volume->dimensions[0], &volume->size[0])) != MI_NOERROR)
    {
      fprintf(stderr, "Error getting dimensions size: %d.\n", result);
      return (NULL);
    }

  if ((result = miget_dimension_size(volume->dimensions[1], &volume->size[1])) != MI_NOERROR)
    {
      fprintf(stderr, "Error getting dimensions size: %d.\n", result);
      return (NULL);
    }

  if ((result = miget_dimension_size(volume->dimensions[2], &volume->size[2])) != MI_NOERROR)
    {
      fprintf(stderr, "Error getting dimensions size: %d.\n", result);
      return (NULL);
    }

  if ((result = miget_dimension_starts(volume->dimensions, 0, volume->dim_nb, volume->starts)) != MI_NOERROR)
    {
      fprintf(stderr, "Error getting dimensions start: %d.\n", result);
      return (NULL);
    }
  if ((result = miget_dimension_separations(volume->dimensions, 0, volume->dim_nb, volume->steps)) != MI_NOERROR)
    {
      fprintf(stderr, "Error getting dimensions steps: %d.\n", result);
      return (NULL);
    }
  if (miget_dimension_name (volume->dimensions[0], &volume->dim_name[0]) != MI_NOERROR ||
      miget_dimension_name (volume->dimensions[1], &volume->dim_name[1]) != MI_NOERROR ||
      miget_dimension_name (volume->dimensions[2], &volume->dim_name[2]))
    {
      fprintf(stderr, "Error getting dimensions name.\n");
      return (NULL);
    }
  // get slices_max
  volume->slices_max = get_slices_max(volume);
  volume->next = NULL;
  return (volume);
}
Ejemplo n.º 2
0
void MINCResource::Load() {
    if (loaded) return;

    int result = miopen_volume(file.c_str(), MI2_OPEN_READ, &handle); 
    if (result != MI_NOERROR) {
        logger.warning << "Error opening the MINC input file: " << file << logger.end;
        return;
    }

    // char** names = new char*[3];
    // names[0] = "x_space";
    // names[1] = "y_space";
    // names[2] = "z_space";
    
    // miset_apparent_dimension_order_by_name(handle, 3, names);



    
    int count;
    miget_volume_voxel_count(handle, &count);
    logger.info << "voxel count: " << count << logger.end;

    // atomic type of the resulting texture (float, int)
    miclass_t klass;
    miget_data_class(handle, &klass);
    logger.info << "data class: " << klass << logger.end;

    // data type of a voxel (float, uchar, ...)
    // convert this type into class type by scaling.
    mitype_t type;
    miget_data_type(handle, &type);
    logger.info << "voxel type: " << type << logger.end;

    misize_t vsize;
    miget_data_type_size(handle, &vsize);
    logger.info << "voxel size in bytes: " << vsize << logger.end;

    midimhandle_t dims[3];
    result = miget_volume_dimensions(handle, MI_DIMCLASS_SPATIAL, 
                                     MI_DIMATTR_ALL, MI_DIMORDER_FILE, 
                                     3, dims);

    if (result != 3) {
        logger.warning << "Only three spatial dimensions supported. Volume has " << result << logger.end;
        return;
    }

    w = h = d = 0;
    // hack: in our files dimensions are given in z,y,x order, so we reverse it.
    miget_dimension_size(dims[0], &w);
    miget_dimension_size(dims[1], &h);
    miget_dimension_size(dims[2], &d);

    // midimhandle_t* dims_app = new midimhandle_t[3];
    // dims_app[0] = dims[2];
    // dims_app[1] = dims[1];
    // dims_app[2] = dims[0];

    // miset_apparent_dimension_order (handle, 3, dims_app);
    logger.info << "dimensions: " << w << " x " << h << " x " << d << logger.end;

    
    // count records
    int recs = 0;
    miget_record_length(handle, &recs);
    logger.info << "record length: " << recs << logger.end;

    // count labels
    int lbls = 0;
    miget_number_of_defined_labels(handle, &lbls);
    logger.info << "# of labels: " << lbls << logger.end;

    // count attributes
    milisthandle_t lhandle;
    milist_start(handle, "", 0, &lhandle);
    char* path = new char[255];
    char* name = new char[255];
    while (milist_attr_next(handle, lhandle, path, 255, name, 255) == MI_NOERROR) {
        logger.info << "path: " << string(path) << " name: " << string(name) << logger.end;
    }
    milist_finish(lhandle);
    delete path;
    delete name;

    // char* nm;
    // miget_dimension_name(dims[2], &nm);
    // string hest(nm);
    // mifree_name(nm);
    // logger.info << "dimension name: " << hest << logger.end;

    char* space_name;
    miget_space_name(handle, &space_name);
    logger.info << "space name: " << string(space_name) << logger.end;
    mifree_name(space_name);

    loaded = true;
}