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