如果图像文件的内容在char数组中,如何使用cv :: imdecode?

Ric*_*nop 6 c++ opencv

我在缓冲区jpegBuffer中有一个jpeg图像.我试图将它传递给cv :: imdecode函数:

Mat matrixJprg = imdecode(Mat(jpegBuffer), 1);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

/home/richard/Desktop/richard/client/src/main.cc:108: error: no matching function for call to ‘cv::Mat::Mat(char*&)’
Run Code Online (Sandbox Code Playgroud)

这是我填写jpegBuffer的方式:

FILE* pFile;
long lSize;
char * jpegBuffer;
pFile = fopen ("img.jpg", "rb");
if (pFile == NULL)
{
    exit (1);
}

// obtain file size.
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

// allocate memory to contain the whole file.
jpegBuffer = (char*) malloc (lSize);
if (jpegBuffer == NULL)
{
    exit (2);
}

// copy the file into the buffer.
fread (jpegBuffer, 1, lSize, pFile);

// terminate
fclose (pFile);
Run Code Online (Sandbox Code Playgroud)

ron*_*nag 14

Mat没有构造函数接受char*参数.试试这个:

std::ifstream file("img.jpg");
std::vector<char> data;

file >> std::noskipws;
std::copy(std::istream_iterator<char>(file), std::istream_iterator<char>(), std::back_inserter(data));

Mat matrixJprg = imdecode(Mat(data), 1);
Run Code Online (Sandbox Code Playgroud)

编辑:

您还应该看看LoadImageM.

如果您的数据已经存在于char*缓冲区中,则一种方法是将数据复制到std :: vector中.

std::vector<char> data(buf, buf + size);
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢.但是如果我将图像放在内存中的缓冲区(例如char*jpegBuffer)并且它没有保存为磁盘上的文件呢?我如何将缓冲区发送到imdecode呢?上面的代码只是一个小小的测试,但后来我将只是从wifi连接到缓冲区读取jpg图像而不将它们保存到文件中. (2认同)

Pro*_*mer 10

我不得不做同样的事情,我的图像数据已经是char数组格式,来自网络和插件源.当前的答案显示了如何执行此操作,但它需要先将数据复制到矢量中,这样会浪费时间和资源.

这可以直接进行而无需创建它的副本.您imdecode(Mat(jpegBuffer), 1);的问题中的代码非常接近.

您需要为以下Mat类使用构造函数重载:

Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Run Code Online (Sandbox Code Playgroud)

要创建它Mat,请传递1给行,将数组的大小传递给cols,CV_8UC1传递给类型,将char数组本身传递给数据参数.将此作为第一个参数和第二个参数传递Matcv::imdecode函数CV_LOAD_IMAGE_UNCHANGED.

基本示例:

char *buffer = dataFromNetwork;
int bufferLength = sizeOfDataFromNetwork;

cv::Mat matImg;
matImg = cv::imdecode(cv::Mat(1, bufferLength, CV_8UC1, buffer), CV_LOAD_IMAGE_UNCHANGED);
Run Code Online (Sandbox Code Playgroud)

完整示例(将名为"test.jpg"的文件读入char数组并用于imdecode解码char数组中的数据然后显示它):

int main() {

    //Open image file to read from
    char imgPath[] = "./test.jpg";
    ifstream fileImg(imgPath, ios::binary);
    fileImg.seekg(0, std::ios::end);
    int bufferLength = fileImg.tellg();
    fileImg.seekg(0, std::ios::beg);

    if (fileImg.fail())
    {
        cout << "Failed to read image" << endl;
        cin.get();
        return -1;
    }

    //Read image data into char array
    char *buffer = new char[bufferLength];
    fileImg.read(buffer, bufferLength);

    //Decode data into Mat 
    cv::Mat matImg;
    matImg = cv::imdecode(cv::Mat(1, bufferLength, CV_8UC1, buffer), CV_LOAD_IMAGE_UNCHANGED);

    //Create Window and display it
    namedWindow("Image from Char Array", CV_WINDOW_AUTOSIZE);
    if (!(matImg.empty()))
    {
        imshow("Image from Char Array", matImg);
    }
    waitKey(0);

    delete[] buffer;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)