2017-03-23 12 views
3

C++의 응용 프로그램에서 Microsoft Face API를 사용하고 싶습니다. cpprest SDK를 사용하면 이미지 또는 이미지의 이진 데이터 URL을 보낼 수 있습니다. 문제는 내 이미지가 디스크에있는 파일이 아니라 메모리에있는 cv :: Mat입니다. stringstream을 통해 직렬화하려고 시도했지만 요청 메소드가 일부 문자열과 istream 만 허용하기 때문에 불평합니다. 여기C++ REST SDK를 사용하여 OpenCV 3에서 Cognitive Face API로 이미지 보내기

file_stream<unsigned char>::open_istream(filename) 
.then([=](pplx::task<basic_istream<unsigned char>> previousTask) 
{ 
    try 
    { 
     auto fileStream = previousTask.get(); 

     auto client = http_client{U("https://api.projectoxford.ai/face/v0/detections")}; 

     auto query = uri_builder() 
      .append_query(U("analyzesFaceLandmarks"), analyzesFaceLandmarks ? "true" : "false") 
      .append_query(U("analyzesAge"), analyzesAge ? "true" : "false") 
      .append_query(U("analyzesGender"), analyzesGender ? "true" : "false") 
      .append_query(U("analyzesHeadPose"), analyzesHeadPose ? "true" : "false") 
      .append_query(U("subscription-key"), subscriptionKey) 
      .to_string(); 

     client 
      .request(methods::POST, query, fileStream) 
    ... 
    } 
} 

file_stream 파일을 여는 데 이용된다 : 파일로부터 이미지를 열면

다음 코드 좋다. 내가 만약 후 디코딩하고 이미지를 재 구축 할 수 있습니다로

// img is the cv::Mat 
    std::vector<uchar> buff; 
    cv::imencode(".jpg", img, buff); 
    std::stringstream ssbuff; 
    copy(buff.begin(), buff.end(), std::ostream_iterator<unsigned char>(ssbuff,"")); 

이 직렬화가 작동합니다 내가 이렇게 내 매트를 직렬화했습니다.

¿ 어떻게 클라이언트를 통해 opencv Mat 이미지를 서버에 보낼 수 있습니까?

+0

fileStream 개체를 API에서 지정한 [이진 데이터] (그렇지 않은)로 바꾸어야합니다. https://westus.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236 –

답변

0

여기에서 (best way to upload uint8_t array to azure blob storage with wastorage in c++)이 질문은 최종 답변으로 연결됩니다.

클라이언트 요청 방법은 동시성 요청 :: 스트림 :: IStream을 개체 원시 데이터를 전달할 때 (여기 문서 참조 : https://microsoft.github.io/cpprestsdk/classweb_1_1http_1_1client_1_1http__client.html#a5195fd9b36b8807456bd529e3cdc97f5) 은 그래서,이 ByteArray 함유 이제 stringstream는 SDK에 의해 제공되는 바이트 스트림 객체를 전달해야 istream 객체 (SDK에서 제공)로 엽니 다.

기본적으로 docs에 따르면 "application/octet-stream"이므로 요청 유형은 명시적일 필요가 없습니다.