使用 REST SDK 将图像从 OpenCV 3 发送到认知人脸 API C++



我想在C++的应用程序中使用Microsoft人脸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,""));

此序列化的工作原理是我可以解码 if 之后并重建映像。

¿如何通过客户端将 opencv Mat 图像发送到服务器?

这里的这个问题(在 C++ 中使用 wastorage 将uint8_t数组上传到 Azure Blob 存储的最佳方法(引导我得出最终答案。

客户端的请求方法在传递原始数据时要求并发::streams::istream 对象(请参阅此处的文档:https://microsoft.github.io/cpprestsdk/classweb_1_1http_1_1client_1_1http__client.html#a5195fd9b36b8807456bd529e3cdc97f5(因此,包含字节数组的字符串流必须传递给 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 ...

请求的类型不需要显式,因为根据文档,默认情况下它是"应用程序/八位字节流"。

最新更新