2015-10-26 2 views
2

Мне предоставлен файл .mat (три измерения, одинарная точность с плавающей запятой), который я бы хотел прочитать, используя VXL. VNL имеет несколько классов/функций для этого, но я не нашел примеров, демонстрирующих их использование. Я собрал следующее вместе с the header file, но никаких данных не читают, и когда я запрашиваю размеры, я получаю то, что кажется неинициализированным барахлом (хотя некоторые данные из заголовка читаются).Чтение файла MatLab (mat) с помощью VNL

#include <vcl_cstdlib.h> 
#include <vcl_iostream.h> 
#include <vcl_fstream.h> 
#include <vnl/vnl_matlab_read.h> 
#include <vnl/vnl_vector.h> 

int main(int argc, char ** argv) 
{ 

    if (2 != argc) 
    { 
    std::cerr << "Provide a file." << std::endl; 
    return EXIT_FAILURE; 
    } 

    const char * fileName = argv[1]; 

    vcl_filebuf fileBuffer; 
    if (!fileBuffer.open(fileName,vcl_ios::in)) 
    { 
    std::cerr << "There was a problem opening the file." << std::endl; 
    return EXIT_FAILURE; 
    } 

    vcl_istream stream(&fileBuffer); 
    vnl_matlab_readhdr read(stream); 

    vcl_cout << read.name() << vcl_endl; // Platform: PCWIN64, Created on: (date and time) 
    vcl_cout << read.rows() << vcl_endl; // 1094852661 
    vcl_cout << read.cols() << vcl_endl; // 774905933 

    vnl_vector<float> data; 
    vnl_matlab_read_or_die(stream, data, fileName); 
    std::cout << data.size() << std::endl; // 0 

    return EXIT_SUCCESS; 

} 

Я не могу сказать, если я использую класс неправильно, или если возможно VNL не может иметь дело с многомерными массивами?

+0

И только записку, [VXL] вероятно, был бы хороший тег на этот вопрос, но я не хватает репутации, чтобы предложить его. Быстрый поиск показывает множество других вопросов о 'vxl', но я не знаю, насколько популярна тема для обоснования тега. Просто мысль. –

ответ

1

Не все файлы MAT используются в том же формате, что и изменено несколько раз. Чтение нежелательной почты может быть попыткой прочитать сжатый MAT-файл с библиотекой, которая не поддерживает сжатие.

Поскольку я не могу найти разумную документацию для выбранной вами библиотеки, я могу только рекомендовать альтернативу. При сохранении MAT-файла в matlab укажите формат -v7.3, который является самым последним. Таким образом, Matlab напишет файл сжатого файла gzip HDF5, который поставляется с an API for C++

Если у вас нет доступа к Matlab, используйте Octave для преобразования ваших Mat-Files в самый последний формат. Здесь параметр для функции save называется -hdf5 и не -7.3

+1

Большое спасибо за ответ, @ Даниэль. Я закончил использовать обходной путь в R. Я читал изображения с использованием 'R.matlab', затем сохранял их как том с помощью' oro.nifti'. Затем я мог бы прочитать их в ITK. Это довольно громоздко, хотя - я дам ваш метод попробовать в следующий раз, когда я получу партию изображений. +1 для документации по API C++! –

Смежные вопросы