2016-04-21 8 views
3

Ich habe eine Bildverarbeitungsanwendung, die Qt und openCV verwendet.So übertragen Sie ein C++ - Objekt an einen Web-Service mit POCO-Bibliothek

für jeden Rahmen, ich sollte das Capture cv :: Mat Bildobjekt an den Server senden, um es zu verarbeiten und die Ergebnisse zu erhalten.

Ich sollte die REST-Architektur für seine niedrige playload verwenden.

Was ist das Werkzeug, das ich verwenden sollte, um cv :: Mat an den Server zu senden.

Ich verwende POCO für Portabilität.

Ich suche nach der leichtesten Lösung, um das zu tun, ich brauche eine Mindestgeschwindigkeit von 10 Frames vom Server in einer Sekunde verarbeitet.

Ich meine, gibt es eine Methode, um das C++ - Objekt ohne explizite Serialisierung an den Server zu übergeben?

+0

1) Serialisieren das Bild in einer Zeichenfolge (leicht mit 'imencode' gemacht und schließlich Base64-Kodierung), 2) über REST die Zeichenfolge senden 3) auf dem Server des Dekodierungs image (base64 decoding und 'imdecode') 4) jetzt hast du deine image serverseite. – Miki

+0

Danke, warum hast du es nicht als Antwort ausgedrückt? Das Problem ist, dass ich noch ein Anfänger in POCO bin und suche, ein komplettes Beispiel in POCO zu haben, das eine cv :: Mat sendet. – ProEns08

+0

Weil eine vollständige Antwort zu breit sein wird (wie die Frage; D). Ich habe dir nur ein paar Hinweise gegeben. Sie können leicht eine Menge Informationen für jeden Schritt finden – Miki

Antwort

2

EDIT

Mit der POCO-Bibliothek, können Sie einen Blick in dieser Antwort nehmen: HttpRequest PUT content in poco library. Er sendet eine Datei an eine ifstream. In dieser Antwort können Sie überprüfen, wie Sie eine cv::Mat in eine istream: OpenCV cv::Mat to std::ifstream for base64 encoding konvertieren.

Und schließlich, dank Polymorphie, ist der istream implizit in einen ifstream umgewandelt.


Sie können das C + + Rest SDK verwenden. Ein Codebeispiel des PUT-Befehls.

Source of code

Library Github where you can find the full documentation.

#include <http_client.h> 
#include <filestream.h> 
#include <iostream> 
#include <sstream> 

using namespace web::http; 
using namespace web::http::client; 

// Upload a file to an HTTP server. 
pplx::task<void> UploadFileToHttpServerAsync() 
{ 
    using concurrency::streams::file_stream; 
    using concurrency::streams::basic_istream; 

    // To run this example, you must have a file named myfile.txt in the current folder. 
    // Alternatively, you can use the following code to create a stream from a text string. 
    // std::string s("abcdefg"); 
    // auto ss = concurrency::streams::stringstream::open_istream(s); 

    // Open stream to file. 
    return file_stream<unsigned char>::open_istream(L"myfile.txt").then([](pplx::task<basic_istream<unsigned char>> previousTask) 
    { 
     try 
     { 
      auto fileStream = previousTask.get(); 

      // Make HTTP request with the file stream as the body. 
      http_client client(L"http://www.fourthcoffee.com"); 
      return client.request(methods::PUT, L"myfile", fileStream).then([fileStream](pplx::task<http_response> previousTask) 
      { 
       fileStream.close(); 

       std::wostringstream ss; 
       try 
       { 
        auto response = previousTask.get(); 
        ss << L"Server returned returned status code " << response.status_code() << L"." << std::endl; 
       } 
       catch (const http_exception& e) 
       { 
        ss << e.what() << std::endl; 
       } 
       std::wcout << ss.str(); 
      }); 
     } 
     catch (const std::system_error& e) 
     { 
      std::wostringstream ss; 
      ss << e.what() << std::endl; 
      std::wcout << ss.str(); 

      // Return an empty task. 
      return pplx::task_from_result(); 
     } 
    }); 

    /* Sample output: 
    The request must be resent 
    */ 
} 
+0

Vielen Dank, + 1.aber ich benutze POCO für Portabilität wie ich bearbeitet habe. – ProEns08

+0

Ich habe meine Antwort bearbeitet, sieht aus, dass die verknüpfte Antwort haben, was Sie brauchen. Ich hoffe es hilft. –

+0

Danke, aber im Beispiel sendet er eine Datei. Ich suche, um ein cv :: Mat oder ein reines C++ Objekt in einem allgemeinen zu senden. – ProEns08