从 IplImage 中提取并保存图像

Posted

技术标签:

【中文标题】从 IplImage 中提取并保存图像【英文标题】:Extract and save an image from a IplImage 【发布时间】:2015-09-22 10:46:24 【问题描述】:

我正在使用 Ximea 相机,使用 c++ 编程并使用 Ubuntu 14.04。我有一个 XI_IMG 图像,在下一次转换中,我正在创建一个 OpenCV 图像,将数据从 xiAPI 缓冲区复制到 OpenCV 缓冲区。

stat = xiGetImage(xiH, 5000, &image);
HandleResult(stat,"xiGetImage");    
XI_IMG* imagen = ℑ

IplImage * Ima = NULL;
char fname_jpg[MAX_PATH] = "";
Ima = cvCreateImage(cvSize(imagen->width, imagen->height), IPL_DEPTH_8U, 1); 
memcpy(Ima->imageData, imagen->bp, imagen->width * imagen->height);

imwrite("image1", Ima);

完成后我应该可以保存或显示图像,但显示下一个错误:

program.cpp:76:24:error:invalid initialization of reference of type 'cv::InputArray aka const cv::_InputArray&' from expression of type 'IplImage* aka IplImage*'

还有其他获取或保存图片的方法吗?我还能做些什么来保存 jpg 图像?

【问题讨论】:

【参考方案1】:

您正在将旧的(和过时的)C 语法(如 IplImage*cv<SomeFunction>() 等)与当前的 C++ 语法混合在一起。 为了使其工作保持一致并仅使用一种 style

使用IplImage

int main()

    IplImage* img = NULL;
    img = cvCreateImage(...);

    // Save 
    cvSaveImage("myimage.png", img);

    // Show
    cvShowImage("Image", img);
    cvWaitKey();

    return 0;

或者使用新的语法(好多了):

int main()

    Mat img(...);

    // Save 
    imwrite("myimage.png", img);

    // Show
    imshow("Image", img);
    waitKey();

    return 0;

请注意,在初始化 Mat 后,您不需要 memcpy 数据,但您可以调用以下构造函数之一:

C++: Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
C++: Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
C++: Mat::Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0)

最后一招,你可以包装你的IplImageMat中,然后使用imwrite

Mat mat(Ima);
imwrite("name.ext", mat);

【讨论】:

以上是关于从 IplImage 中提取并保存图像的主要内容,如果未能解决你的问题,请参考以下文章

opencv视频逐帧提取,然后图像叠加得出一个图像要用到啥函数?

压缩原始图像缓冲区

OpenCV:Mat,IplImage,CvMat类型转换

无法释放从 iplimage 创建的 mat 图像

OpenCV 中 IplImage,CvMat,Mat中的type是怎么回事

如何从 hdf5 保存/提取数据集并转换为 TiFF?