2017-02-07 27 views
0

這感覺像一個非常簡單的問題,但我一直無法找到答案。函數讀取通用數據類型的文件

我有一個函數,它讀取(二進制)文件並將內容提供給openCV圖像。目前該文件始終是「無符號字符」數據類型,但我想擴大對其他數據類型的支持。作爲函數的參數是優選的。

我對C++並不是非常有經驗,但是經過Google搜索後感覺像是應該用模板來完成的事情,但我真的不確定如何實現它。

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不是模板類。只需向構造函數提供一個不同的type參數(當前硬編碼爲CV_64F),即可構建不同的cv::Mat

像這樣:

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