Извлеките и сохраните изображение из IplImage

Я работаю с камерой Ximea, программирую на С++ и использую 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?


person Nora    schedule 22.09.2015    source источник


Ответы (1)


Вы смешиваете старый (и устаревший) синтаксис 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)

Последний трюк: вы можете обернуть IplImage в Mat, а затем использовать imwrite:

Mat mat(Ima);
imwrite("name.ext", mat);
person Miki    schedule 22.09.2015