Отправка изображения из OpenCV 3 в Cognitive Face API с помощью C ++ REST SDK

Я хочу использовать Microsoft Face API из приложения на C ++. 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 через клиента?

3

Решение

Этот вопрос тут (лучший способ загрузить массив uint8_t в хранилище BLOB-объектов Azure с помощью wastorage в c ++) приведи меня к окончательному ответу.

Метод request для клиента запрашивает объект concurrency :: streams :: istream при передаче необработанных данных (см. Документацию здесь: https://microsoft.github.io/cpprestsdk/classweb_1_1http_1_1client_1_1http__client.html#a5195fd9b36b8807456bd529e3cdc97f5)
Таким образом, поток строк, содержащий bytearray, должен быть передан объекту байтового потока, предоставленному 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 ...

Тип запроса не обязательно должен быть явным, так как он по умолчанию является «application / octet-stream» в соответствии с документацией.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]