2017-03-23 8 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でも提供されています)で開きます。

concurrency::streams::bytestream byteStream = 
concurrency::streams::bytestream(); 
concurrency::streams::istream inputStream = 
byteStream.open_istream(ssbuff.str()); 
auto fileStream = inputStream; 
// Build uri and so on ... 
client.request(methods::POST, query, fileStream) 
// async processing ... 

それがドキュメントによると、「アプリケーション/オクテットストリーム」としてデフォルトであるように、要求のタイプは、明示的であることが必要とされません。

関連する問題