¡Hola, mundo! en C++

  1. Asegúrate de tener una versión funcional del framework de MediaPipe. Consulta las instrucciones de instalación.

  2. Para ejecutar el ejemplo de hello world, haz lo siguiente:

    $ 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. En el ejemplo de hello world, se usa un gráfico de MediaPipe simple en la función PrintHelloWorld(), definida en un proto 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"
        }
      )");
    

    Puedes visualizar este gráfico con MediaPipe Visualizer. Para ello, pega el contenido de CalculatorGraphConfig que aparece a continuación en el visualizador. Consulta aquí para obtener ayuda sobre el 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"
        }
    

    Este gráfico consta de 1 flujo de entrada de gráfico (in) y 1 flujo de salida de gráfico (out), y 2 PassThroughCalculator conectadas en serie.

    gráfico de hello_world

  4. Antes de ejecutar el grafo, se conecta un objeto OutputStreamPoller al flujo de salida para recuperar más tarde el resultado del grafo y se inicia la ejecución del grafo 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. Luego, en el ejemplo, se crean 10 paquetes (cada paquete contiene una string “Hello World!” con valores de marca de tiempo que van de 0, 1, ... 9) con la función MakePacket, se agrega cada paquete al gráfico a través del flujo de entrada in y, por último, se cierra el flujo de entrada para finalizar la ejecución del 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. Mediante el objeto OutputStreamPoller, el ejemplo recupera los 10 paquetes de la transmisión de salida, obtiene el contenido de la string de cada paquete y lo imprime en el registro de salida.

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