2017-02-07 11 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はテンプレートクラスではありません。異なる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

関連する問題