opencv中的图片流保存

做图片流处理的时候总是保存不对,

图片如下

用如下代码保存,其中Arr是byte数组

    //IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, Channels);
    //IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
    //cvZero(img);
    //img->imageData =(char*) Arr;
    //img->imageDataOrigin= (char*)Arr;
    //cv::Mat mImg(img, 0);
    

这种效果

    //Mat mImg(height, width, CV_8UC(Channels), (uchar*)Arr);
    //Mat mImg(height, width, CV_8UC(depth), (uchar*)Arr);
    //IplImage *img = &IplImage(mImg);


    imwrite(LPCSTR(csFile), mImg);

         

我需要冷静一下!!!!!!

研究了一下,改成如下

    IplImage *img = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, Channels);
    cvSetData(img, Arr, Channels*width);
    cv::Mat mImg(img, 0);

终于完美还原,问题来了,什么原因呢?

 

其实要想完美实现图片流解析,还是很简单的,主要,要找到对应的opencv的api

int getCvArr( byte*    Arr, int size){
    vector<char> vec;
    for (int i = 0; i < size; i++) {
        vec.push_back(*(Arr+i));
    }
    Mat mImg = imdecode(Mat(vec), 1);
}

 其中的imdecode

CV_EXPORTS_W Mat imdecode( InputArray buf, int flags );

使用了Mat(vec)装换成InputArray类型

 

文件转化成为字节流

    #include <fstream>
        ifstream infile;
    infile.open("D:/facesdktest/testproject/1_chenkun.jpg", ios::binary);
    if (!infile) { return; }
    infile.seekg(0, ios::end);
    unsigned long len = infile.tellg();
    BYTE *buffer = new BYTE[len];
    infile.seekg(0, ios::beg);
    infile.read((char*)buffer, len);
    //还有些检查流状态,上一次操作状态函数
    infile.close();    

其中buffer是字节流的指针,len是字节流的长度

Mat转数据流,便于网络传输二进制流

 

posted @ 2017-04-26 21:44  balder_m  阅读(1865)  评论(0编辑  收藏  举报