Получение данных изображения из базы данных в формате cv :: Mat с использованием C ++ и Ado

Я пытаюсь прочитать изображение из базы данных MS-SQL с помощью ADO (C ++). Изображения хранятся как varBinary (max) в базе данных. Я пытался получить и конвертировать изображения в cv::Mat формат.

Вот код, который у меня есть,

    HRESULT hr = ::CoInitialize(NULL);

ADODB::_ConnectionPtr pConnection;
hr = pConnection.CreateInstance(__uuidof(ADODB::Connection));
pConnection->CursorLocation = ADODB::adUseClient;

hr=pConnection->Open(L"Provider=sqloledb;Data Source=SAMPLE-DB;"L"Initial Catalog=IMAGE;User Id=sr;Password=****;", L"",
L"", ADODB::adConnectUnspecified);

if (FAILED(hr))
{
//error handling...
}

ADODB::_RecordsetPtr recordset;
hr = recordset.CreateInstance(__uuidof(ADODB::Recordset));

std::string cmd = "SQL COMMAND THAT PROVIDE IMAGE BINARY";

recordset->Open(cmd.c_str(), pConnection.GetInterfacePtr(),

ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adCmdText);

std::vector<uchar> buffer;
buffer = recordset->Fields->GetItem(L"ImgBinary")->GetValue(); //problem!!

cv::Mat testImage = cv::imdecode(buffer,cv::IMREAD_COLOR); //problem!!

cv::namedWindow("MyWindow");
cv::imshow("MyWindow",testImage);

Ошибки, которые я получил,

1-) ‘cv :: imdecode’: ни одна из двух перегрузок не может преобразовать все типы аргументов

2-) IntelliSense: нет подходящего пользовательского преобразования из «_variant_t» в
«std :: vector>» существует

Не могли бы вы помочь? Как я могу получить изображение как cv::Mat формат?

Спасибо в адвенс

0

Решение

Задача решена! Проблема была GetValue() метод. Нам нужно использовать GetChunk() метод, потому что мы получаем массив из базы данных. GetChunk() должен иметь параметр размера. Мы можем получить размер с,

long lngSize = recordset->Fields->GetItem(L"ImgBinary")->ActualSize;

строка кода.

Отредактированная версия кода ниже,

HRESULT hr = ::CoInitialize(NULL);
ADODB::_ConnectionPtr pConnection;
hr = pConnection.CreateInstance(__uuidof(ADODB::Connection));
pConnection->CursorLocation = ADODB::adUseClient;

hr=pConnection->Open(L"Provider=sqloledb;Data Source=SAMPLE-DB;"L"Initial Catalog=IMAGE;User Id=sr;Password=****;", L"",
L"", ADODB::adConnectUnspecified);

if (FAILED(hr))
{
//error handling...
}

ADODB::_RecordsetPtr recordset;
hr = recordset.CreateInstance(__uuidof(ADODB::Recordset));

std::string cmd = "SQL COMMAND THAT PROVIDE IMAGE BINARY";

recordset->Open(cmd.c_str(), pConnection.GetInterfacePtr(),

ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adCmdText);

/////////////// Edited Part ///////////////

long lngSize = recordset->Fields->GetItem(L"ImgBinary")->ActualSize;

_variant_t varChunk = recordset->Fields->GetItem(L"ImgBinary")->GetChunk(lngSize);

std::vector<uchar> buffer(lngSize);
SAFEARRAY* pData=NULL;
pData=V_ARRAY(&varChunk);

void *pVoid = 0;
hr = ::SafeArrayAccessData(pData, &pVoid);
uchar *pBinary = reinterpret_cast<uchar *>(pVoid);

for (int i = 0; i < pData->rgsabound[0].cElements; ++i)
{
buffer[i] = pBinary[i];
}

hr = ::SafeArrayUnaccessData(pData);
cv::Mat testImage = cv::imdecode(buffer,cv::IMREAD_COLOR);
cv::namedWindow("MyWindow");
cv::imshow("MyWindow",testImage);
cv::waitKey();
0

Другие решения

Других решений пока нет …