OpenCV用于内存缓冲区或文件指针

The*_*own 17 c++ memory opencv

openCV中的两个函数cvLoadImage和cvSaveImage接受文件路径作为参数.

例如,保存图像时,它是cvSaveImage("/ tmp/output.jpg",dstIpl),并在磁盘上写入.

有没有办法在内存中提供这个缓冲区?因此,输出图像将在内存中,而不是磁盘写入.

我还想知道cvSaveImage和cvLoadImage(读取和写入内存缓冲区).谢谢!


我的目标是将文件的Encoded(jpeg)版本存储在Memory中.同样适用于cvLoadImage,我想将内存中的jpeg加载到IplImage格式中.

cod*_*eDr 17

这对我有用

// decode jpg (or other image from a pointer)
// imageBuf contains the jpg image
    cv::Mat imgbuf = cv::Mat(480, 640, CV_8U, imageBuf);
    cv::Mat imgMat = cv::imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);
// imgMat is the decoded image

// encode image into jpg
    cv::vector<uchar> buf;
    cv::imencode(".jpg", imgMat, buf, std::vector<int>() );
// encoded image is now in buf (a vector)
    imageBuf = (unsigned char *) realloc(imageBuf, buf.size());
    memcpy(imageBuf, &buf[0], buf.size());
//  size of imageBuf is buf.size();
Run Code Online (Sandbox Code Playgroud)

我被问及C版而不是C++:

#include <opencv/cv.h>
#include <opencv/highgui.h>

int
main(int argc, char **argv)
{
    char *cvwin = "camimg";

    cvNamedWindow(cvwin, CV_WINDOW_AUTOSIZE);

    // setup code, initialization, etc ...
    [ ... ]

    while (1) {      
        // getImage was my routine for getting a jpeg from a camera
        char *img = getImage(fp);
        CvMat mat;

   // substitute 640/480 with your image width, height 
        cvInitMatHeader(&mat, 640, 480, CV_8UC3, img, 0);
        IplImage *cvImg = cvDecodeImage(&mat, CV_LOAD_IMAGE_COLOR);
        cvShowImage(cvwin, cvImg);
        cvReleaseImage(&cvImg);
        if (27 == cvWaitKey(1))         // exit when user hits 'ESC' key
        break;
    }

    cvDestroyWindow(cvwin);
}
Run Code Online (Sandbox Code Playgroud)


M45*_*456 15

libn的SVN版本中有几个未记录的函数:

CV_IMPL CvMat* cvEncodeImage( const char* ext, 
                              const CvArr* arr, const int* _params )

CV_IMPL IplImage* cvDecodeImage( const CvMat* _buf, int iscolor )
Run Code Online (Sandbox Code Playgroud)

最新的签入消息表明它们用于bmp,png,ppm和tiff(仅编码)的本机编码/解码.

或者,您可以使用标准图像编码库(例如libjpeg)并操纵IplImage中的数据以匹配编码库的输入结构.

  • 请不要依赖未记录的功能,你将为自己创造一个维护噩梦.他们没有记录的原因是因为设计师**不希望它们随着时间的推移保持稳定**.他们可能会在下一个版本中消失! (8认同)
  • 我认为任何开发版本都暗示了这个警告.此外,文档一直是OpenCV的一个问题,许多稳定的功能仍然没有记录. (3认同)