2017-02-07 8 views
0

Это очень простой вопрос, но я не смог найти ответ на него.Функция для чтения файла с общим типом данных

У меня есть функция, которая читает (двоичный) файл и передает содержимое в изображение openCV. В настоящее время файл всегда имеет тип данных «unsigned char», но я хотел бы расширить поддержку других типов данных. Предпочтительно как аргумент функции.

Я не очень опытен с C++, но после того, как поиск в нем походит на что-то, что должно быть сделано с помощью шаблонов, но я действительно не уверен, как его реализовать.

cv::Mat ReadImage(const char * filename, int dataTypeSize, int imageWidth) 
{ 
    auto read_image = fopen(filename, "rb"); 

    if (read_image == nullptr) 
    { 
     printf("Image Not Found\n"); 
     return cv::Mat(); 
    } 

    fseek(read_image, 0, SEEK_END); 
    int fileLen = ftell(read_image); 
    fseek(read_image, 0, SEEK_SET); 

    auto pre_image = static_cast<unsigned char *>(malloc(fileLen)); 
    auto data = fread(pre_image, 1, fileLen, read_image); 

    // Printed and verify the values 
    //printf("File Size %d\n", fileLen); 
    //printf("Read bytes %zd\n", data); 

    auto width = imageWidth; 
    auto height = fileLen/dataTypeSize/imageWidth; 

    fclose(read_image); 

    vector<unsigned char> buffer(pre_image, pre_image + data); 

    auto img = cv::Mat(height, width, CV_64F, pre_image); 

    //printf("Image rows %d\n", img.rows); 
    //printf("Image cols %d\n", img.cols); 

    return img; 
} 
+2

нет 'double' в этом коде, или я что-то отсутствует? – user463035818

+0

Не могли бы вы привести пример того, что уже работает (входной файл и вывод), и что бы вы хотели выполнить? – bitcell

+0

@ tobi303 Нет, я вставил неправильный код :) Этот файл читает файл без знака. Я перефразирую вопрос в соответствии с кодом, но идея все та же. Я хочу, чтобы функция могла читать файлы с различными типами данных. – Markus

ответ

1

cv::Mat не является классом шаблонов. Вы можете построить другой cv::Mat просто путем подачи другого параметра type в конструктор (в настоящее время жестко закодированный как CV_64F).

Как это:

cv::Mat ReadImage(const char * filename, int dataTypeSize, int imageWidth, int type) 
{ 

    . . . 

    auto img = cv::Mat(height, width, type, pre_image); 
    return img; 
} 

auto mat = ReadImage("abc", 8, 1000, CV_32S); 
+0

' CV_64S' не существует. Например, вы можете использовать 'CV_32S'. Также это не учитывает изображения с более чем 1 каналом, но это ошибка OP. – Miki