我可以使用imwrite()将图像(如“face.jpg”)写入磁盘, 然后使用fstream将这个jpg读入一个数组。这个数组就是我想要的。
但是,如何快速得到这个?来自memmory而不是磁盘。 我认为Mat.data中的图像数据,长度是Mat.cols * Mat.rows.I不确定它是不是正确的。所以,我用fstream将它写入磁盘,然后用图像查看器打开它,没有任何东西。一定是错的。
Mat frame;
VideoCapture cap(0);
if (!cap.isOpened())
{
return -1;
}
cap.set(CV_CAP_PROP_FRAME_WIDTH, 160);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120);
cap >> frame;
if(frame.empty()){
return -2;
}
//I just want the pointer and length of image information,the following is just for testing
//whether that the same as I thought,if it's right ,frame.data and len is what I want,but it not work.
FILE *fp = fopen("face.jpg", "wb");
if (NULL==fp)
{
return -1;
}
int len = frame.cols*frame.rows; //or 3*frame.cols*frame.rows
fwrite(frame.data, len, sizeof(char), fp);
fclose(fp);
namedWindow("face", 1);
imshow("face", frame);
waitKey(1000);
我是opencv的新手,我只想获取图片数据。谢谢你的帮助!
答案 0 :(得分:0)
在将尺寸写入磁盘之前,您是否检查了尺寸?其他人在这里查看您的代码会很有帮助。对于Mat,除非您的数据是灰度,否则大小将超过cols *行。你应该验证格式是RGB,RGBA还是YUV等。在JPEG的情况下,它很可能是RGBX;所以你应该检查你的流大小是3 * cols * rows还是4 * cols * rows。
答案 1 :(得分:0)
我只是用imencode()做了这个,感谢@ZdaR。
vector<uchar> buff;
vector<int>param = vector<int>(2);
param[0] = CV_IMWRITE_JPEG_QUALITY;
param[1] = 95;
imencode(".jpg", frame, buff, param);
int len = buff.size();
FILE *fout;
fout = fopen("555.jpg", "wb");
if(NULL==fout){
return -3;
}
fwrite(&buff[0], 1, len*sizeof(uchar), fout);
fclose(fout);