Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数读取泛型数据类型的文件_C++_Opencv_Templates_Generics_Types - Fatal编程技术网

C++ 函数读取泛型数据类型的文件

C++ 函数读取泛型数据类型的文件,c++,opencv,templates,generics,types,C++,Opencv,Templates,Generics,Types,这感觉像是一个非常简单的问题,但我还没有找到答案 我有一个函数,它读取二进制文件并将内容输入到openCV图像中。目前,该文件始终为unsigned char数据类型,但我希望扩展对其他数据类型的支持。最好作为函数的参数 我对C++很有经验,但是在Google环绕之后,感觉好像应该用模板来做,但是我真的不知道如何实现它。 cv::Mat ReadImage(const char * filename, int dataTypeSize, int imageWidth) { auto re

这感觉像是一个非常简单的问题,但我还没有找到答案

我有一个函数,它读取二进制文件并将内容输入到openCV图像中。目前,该文件始终为unsigned char数据类型,但我希望扩展对其他数据类型的支持。最好作为函数的参数

<>我对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;
}
cv::Mat不是模板类。只需向当前硬编码为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);

该代码中没有double,或者我遗漏了什么?您可以发布一个示例,说明输入文件和输出已经在工作,您希望实现什么吗?@tobi303不,我粘贴了错误的代码:这个代码读取一个未签名字符的文件。我将重新措辞这个问题,使之与代码相匹配,但想法仍然是一样的。我希望该函数能够读取各种类型的文件datatypes@tobi303我假设cv::Mat和/或cv_64F与问题相关。请查看重复cv_64S中的函数matread不存在。您可以将CV_32S作为示例。此外,这不考虑具有超过1个通道的图像,但这是OP的错误。