使用 C++ REST SDK 将图像从 OpenCV 3 发送到 Cognitive Face API
Send image from OpenCV 3 to Cognitive Face API using C++ REST SDK
我想在 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图像发送到服务器?
这里的这个问题 () 引导我得出最终答案。
客户端的请求方法在传递原始数据时要求 concurrency::streams::istream 对象(请参阅此处的文档:https://microsoft.github.io/cpprestsdk/classweb_1_1http_1_1client_1_1http__client.html#a5195fd9b36b8807456bd529e3cdc97f5)
所以,包含bytearray的stringstream必须传递给SDK提供的bytestream对象,并用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 ...
请求的类型不需要明确,因为根据文档默认为 "application/octet-stream"。
我想在 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图像发送到服务器?
这里的这个问题 (
客户端的请求方法在传递原始数据时要求 concurrency::streams::istream 对象(请参阅此处的文档:https://microsoft.github.io/cpprestsdk/classweb_1_1http_1_1client_1_1http__client.html#a5195fd9b36b8807456bd529e3cdc97f5) 所以,包含bytearray的stringstream必须传递给SDK提供的bytestream对象,并用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 ...
请求的类型不需要明确,因为根据文档默认为 "application/octet-stream"。