Hello World! in C++

  1. Assicurati di avere una versione funzionante di MediaPipe Framework. Consulta le istruzioni di installazione.

  2. Per eseguire l'esempio hello world:

    $ git clone https://github.com/google/mediapipe.git
    $ cd mediapipe
    
    $ export GLOG_logtostderr=1
    # Need bazel flag 'MEDIAPIPE_DISABLE_GPU=1' as desktop GPU is not supported currently.
    $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
        mediapipe/examples/desktop/hello_world:hello_world
    
    # It should print 10 rows of Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    
  3. L'esempio hello world utilizza un semplice grafico MediaPipe nella funzione PrintHelloWorld(), definita in un protocollo CalculatorGraphConfig.

    absl::Status PrintHelloWorld() {
      // Configures a simple graph, which concatenates 2 PassThroughCalculators.
      CalculatorGraphConfig config = ParseTextProtoOrDie<CalculatorGraphConfig>(R"(
        input_stream: "in"
        output_stream: "out"
        node {
          calculator: "PassThroughCalculator"
          input_stream: "in"
          output_stream: "out1"
        }
        node {
          calculator: "PassThroughCalculator"
          input_stream: "out1"
          output_stream: "out"
        }
      )");
    

    Puoi visualizzare questo grafico utilizzando MediaPipe Visualizer incollando i contenuti CalculatorGraphConfig di seguito nel visualizzatore. Consulta questa pagina per ricevere assistenza sul visualizzatore.

        input_stream: "in"
        output_stream: "out"
        node {
          calculator: "PassThroughCalculator"
          input_stream: "in"
          output_stream: "out1"
        }
        node {
          calculator: "PassThroughCalculator"
          input_stream: "out1"
          output_stream: "out"
        }
    

    Questo grafico è composto da un flusso di input del grafico (in), un flusso di output del grafico (out) e due PassThroughCalculator collegati in serie.

    grafico hello_world

  4. Prima di eseguire il grafico, un oggetto OutputStreamPoller viene collegato al flusso di output per recuperare l'output del grafico in un secondo momento, mentre l'esecuzione del grafico viene avviata con StartRun.

    CalculatorGraph graph;
    MP_RETURN_IF_ERROR(graph.Initialize(config));
    MP_ASSIGN_OR_RETURN(OutputStreamPoller poller,
                        graph.AddOutputStreamPoller("out"));
    MP_RETURN_IF_ERROR(graph.StartRun({}));
    
  5. L'esempio crea quindi 10 pacchetti (ogni pacchetto contiene una stringa "Hello World!" con valori di timestamp compresi tra 0, 1 e ... 9) utilizzando la funzione MakePacket, aggiunge ciascun pacchetto nel grafico tramite il flusso di input in e infine chiude il flusso di input per terminare l'esecuzione del grafico.

    for (int i = 0; i < 10; ++i) {
      MP_RETURN_IF_ERROR(graph.AddPacketToInputStream("in",
                         MakePacket<std::string>("Hello World!").At(Timestamp(i))));
    }
    MP_RETURN_IF_ERROR(graph.CloseInputStream("in"));
    
  6. Tramite l'oggetto OutputStreamPoller, l'esempio recupera quindi tutti e 10 i pacchetti dal flusso di output, recupera il contenuto della stringa da ciascun pacchetto e lo stampa nel log di output.

    mediapipe::Packet packet;
    while (poller.Next(&packet)) {
      LOG(INFO) << packet.Get<string>();
    }