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.

Спасибо!

0 ответов

Другие вопросы по тегам