我在缓冲区jpegBuffer中有一个jpeg图像。我正试图将它传递给cv :: imdecode函数:
Mat matrixJprg = imdecode(Mat(jpegBuffer), 1);
我收到此错误:
/home/richard/Desktop/richard/client/src/main.cc:108: error: no matching function for call to ‘cv::Mat::Mat(char*&)’
这就是我填写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);
答案 0 :(得分: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);
编辑:
您还应该查看LoadImageM。
如果您的数据已经存在于char *缓冲区中,则一种方法是将数据复制到std :: vector中。
std::vector<char> data(buf, buf + size);
答案 1 :(得分:8)
我必须做同样的事情,我的图像数据已经是char
数组格式,并且来自网络和插件源。当前answer显示了如何执行此操作,但它需要先将数据复制到矢量,这会浪费时间和资源。
这可以直接进行而无需创建它的副本。您的问题与imdecode(Mat(jpegBuffer), 1);
代码非常接近。
您需要为以下Mat
类使用构造函数重载:
Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
要创建此Mat
,请将1
传递给行,将数组的大小传递给cols,将CV_8UC1
传递给类型,将char数组本身传递给数据参数。将此Mat
传递给cv::imdecode
函数,将mat作为第一个参数,将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);
完成示例(将名为“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;
}