如何保存IplImage?

时间:2011-03-23 18:54:47

标签: c opencv

当我们有IplImage时,我们如何保存它以便我们以后可以使用它,或者将其视为代码之外的图像(例如通过png或jpeg)?

作为代码示例,我有以下内容:

void SaveImage()
{
    CvSize size;
    IplImage *rgb_img;
    int i = 0;

    size.height = HEIGHT;
    size.width = WIDTH;

    rgb_img = cvCreateImageHeader(size, IPL_DEPTH_8U, 3);
    rgb_img->imageData = my_device.ColorBuffer;
    rgb_img->imageDataOrigin = rgb_img->imageData;

    /*for (i = 2; i < rgb_img->imageSize; i+= 3)
    {
        // confirming all values print correctly
        printf("%d, ", rgb_img->imageData[i]);
    }*/

    cvSaveImage("foo.png",rgb_img);
}

我已经在注释掉的for循环中打印出所有值,看起来数据正好在缓冲区中。使用cvShowImage显示图像也可以正常工作,所以看起来图像的结构很好。

2 个答案:

答案 0 :(得分:5)

void SaveImage()
{
    CvSize size;
    IplImage *rgb_img;
    int i = 0;

    size.height = HEIGHT;
    size.width = WIDTH;

    rgb_img = cvCreateImageHeader(size, IPL_DEPTH_8U, 3);
    rgb_img->imageData = my_device.ColorBuffer;

    // You should NOT have the line below or OpenCV will try to deallocate your data
    //rgb_img->imageDataOrigin = rgb_img->imageData;

    for (i = 0; i < size.height; i++)
    {
        for (j = 0;j < size.width; j++)
        {
        // confirming all values print correctly
        printf("%c, ", rgb_img->imageData[i*width + j]);
        }
    }

    cvSaveImage("foo.png",rgb_img);
}

运行它不应该崩溃。

您的代码存在一些问题

  • 您使用%f打印,但IPL_DEPTH_8U是1字节uchar

答案 1 :(得分:1)

保存:

cvSaveImage(outFileName,img)

如果您想检查它已保存,您可以执行以下操作:

  if(!cvSaveImage(outFileName,img)) printf("Could not save: %s\n",outFileName);

取自http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00052000000000000000 - Google上的“opencv write iplimage”的最佳结果。