Я пытаюсь прочитать изображение из базы данных 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
формат?
Спасибо в адвенс
Задача решена! Проблема была 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();
Других решений пока нет …