3

C++ のアプリケーションから Microsoft Face API を使用したいと考えています。cpprest SDK を使用すると、画像の URL または画像のバイナリ データを送信できます。問題は、イメージがディスク内のファイルではなく、メモリ内の cv::Mat であることです。文字列ストリームを介してシリアル化しようとしましたが、一部の文字列と istream のみを受け入れるため、リクエスト メソッドは文句を言います。

次のコードは、ファイルから画像を開くときに適しています。

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イメージをサーバーに送信するにはどうすればよいですか?

4

1 に答える 1