opencv中的图片流保存

Posted 风翼科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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转数据流,便于网络传输二进制流

 

以上是关于opencv中的图片流保存的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 和 python - 裁剪网络摄像头流并将其保存到文件

关于OpenCV调用摄像头及视频和图片的保存

openCV采集摄像头图片并保存的方法

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

将OpenCV函数findContours()得到的每一个轮廓单独绘制并保存为图片文件的Python代码

opencv中为啥保存的图片和显示的图片不同?