2017-03-14 11 views
0

ADO (C++)를 사용하여 MS-SQL 데이터베이스에서 이미지를 읽지 않습니다. 이미지는 데이터베이스에 varBinary (max)로 저장됩니다. 이미지를 가져 와서 cv::Mat 형식으로 변환하려고했습니다. 2 오버로드의 아무도는 모든 인수를 변환 할 수 없었다 : 여기 C++ 및 Ado를 사용하여 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();