从IplImage中提取并保存图像

时间:2015-09-22 10:46:25

标签: c++ linux opencv iplimage ximea

我正在使用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 个答案:

答案 0 :(得分:4)

您正在将旧的(和过时的)C语法(如IplImage*cv<SomeFunction>()等)与当前的C ++语法混合使用。 使其工作一致并仅使用一个样式

使用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;
}

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

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)

最后一招,您可以<{1}} 包裹 IplImage,然后使用Mat

imwrite