Hello World! em C++

  1. Confira se você tem uma versão funcional do MediaPipe Framework. Consulte as instruções de instalação.

  2. Para executar o exemplo do 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. O exemplo hello world usa um gráfico simples do MediaPipe na função PrintHelloWorld(), definida em um protótipo do 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"
        }
      )");
    

    Para visualizar esse gráfico, use o MediaPipe Visualizer. Para isso, cole o conteúdo de CalculatorGraphConfig abaixo no visualizador. Acesse este link para receber ajuda sobre o visualizador.

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

    Esse gráfico consiste em um fluxo de entrada (in) do gráfico, um fluxo de saída do gráfico (out) e dois PassThroughCalculators conectados em série.

    Gráfico de hello_world

  4. Antes de executar o gráfico, um objeto OutputStreamPoller é conectado ao fluxo de saída para recuperar posteriormente a saída do gráfico, e uma execução de gráfico é iniciada com 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. Em seguida, o exemplo cria 10 pacotes (cada pacote contém uma string "Hello World!" com valores de carimbo de data/hora que variam de 0, 1, ... 9) usando a função MakePacket, adiciona cada pacote ao gráfico pelo fluxo de entrada in e, por fim, fecha o fluxo de entrada para concluir a execução do gráfico.

    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. Com o objeto OutputStreamPoller, o exemplo recupera todos os 10 pacotes do stream de saída, extrai o conteúdo da string de cada pacote e o exibe no registro de saída.

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