C ++ и OpenCV для обработки изображения с камеры IDS; преобразовать в мат - PullRequest
1 голос
/ 17 января 2020

Я новичок в 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: Благодаря подходу Юнуса Темурленка я смог создать Мат. Это метод в моем классе для создания Mat:

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: wit works Теперь я добавил определение проппера для Мат.

Спасибо!

...