C++ и OpenCV для обработки изображения с камеры IDS; преобразовать в Mat
Я новичок в C++, OpenCV и в концепции указателей, поэтому прошу прощения за любые тривиальные ошибки с моей стороны.
Я пытаюсь получить изображения с камеры IDS через SDK производителя (называемый uEye) и обработать их как можно быстрее через OpenCV. Я могу выделить память, загрузить изображение с камеры и сохранить его как файл (все это с помощью функций SDK; я сохраняю изображение только для целей отладки). Но вместо сохранения я хочу передать его своему OpenCV-конвейеру как тип Mat. Теперь я не знаю, как сделать это преобразование. Я погуглил, но не нашел подсказки.
Вот мой код:
int numcams = 2; // number of cameras used
char* pcImageMemory[numcams]; // pointer to buffer
int iMemID[numcams]; // buffer ID
// capture image with camera 1
int ID = 1;
// use this uEye function to allocate the memory; hCam is a camera handle I generate for every
// camera; uWidth and uHeight give me the size of the image, uBitspixel gives the number of bits per
// pixel
is_AllocImageMem(hCam, uWidth, uHeight, uBitspixel, &pcImageMemory[ID], &iMemID[ID]);
// use this uEye function to activate the allocated memory for the next image acquisition
is_SetImageMem(hCam, pcImageMemory[ID], iMemID[ID]);
// use this uEye function to catpure an image
is_FreezeVideo(hCam, IS_WAIT);
// save the image
ImageFileParams.pwchFileName = L"LOCAL PATH";
ImageFileParams.nFileType = IS_IMG_PNG;
ImageFileParams.nQuality = 100;
is_ImageFile(hCam, IS_IMAGE_FILE_CMD_SAVE, (void*)&ImageFileParams, sizeof(ImageFileParams));
Надеюсь, этот фрагмент моего класса C++ не слишком запутан.
Было бы здорово, если бы у кого-нибудь была подсказка, как преобразовать изображение из моего буфера в тип OpenCV Mat. Есть ли способ сделать это без фактического копирования байтов в ОЗУ, чтобы быть как можно быстрее? Мне также интересно, есть ли проблема с передачей указателя из моего класса выше в качестве возвращаемого значения моей основной программе (я только что слышал где-то, что возвращаемые указатели могут вызвать проблемы)?
Заранее большое спасибо!
edit: Благодаря подходу Юнуса Темурленка я смог создать коврик. Это метод моего класса для создания коврика:
cv::Mat idsWrapper::CaptureMat(INT ID, cv::Mat mat)
{
//// capture an image
nRet = is_FreezeVideo(hCam, IS_WAIT); // IS_WAIT IS_DONT_WAIT);
if (nRet != IS_SUCCESS)
{
cout << "ERROR: Image could not be captured for IDS camera with ID "
<< hCam << ". Error code: " << nRet << endl;
}
VOID* pMem_b;
int retInt = is_GetImageMem(hCam, &pMem_b);
if (retInt != IS_SUCCESS) {
cout << "Image data could not be read from memory!" << endl;
}
memcpy(mat.ptr(), pMem_b, mat.cols * mat.rows);
return mat;
};
Вот как я вызываю метод отображения файла Mat в окне:
...
Mat matIDS1 (height,Swidth, CV_8UC1);
Mat matIDS1 = IDS1.CaptureMat(1, matIDS1);
namedWindow("Display window", WINDOW_AUTOSIZE);
imshow("Display window", matIDS1);
waitKey(10);
...
edit: остроумие теперь работает, я добавил определение propper для Mat.
Спасибо!