Opencv如何快速从Mat获取图像流?

时间:2016-09-12 10:06:54

标签: c++ opencv

我可以使用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的新手,我只想获取图片数据。谢谢你的帮助!

2 个答案:

答案 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);