¡Hola, mundo! en C++

  1. Asegúrate de tener una versión funcional del marco de trabajo de MediaPipe. Consulta 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. El ejemplo de hello world usa un gráfico MediaPipe simple en el 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 usando MediaPipe Visualizer pegando CalculatorGraphConfig 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 del gráfico (in) y 1 flujo de salida del grafo (out) y 2 PassThroughCalculator conectados en serie.

    Gráfico de hello_world

  4. Antes de ejecutar el grafo, se conecta un objeto OutputStreamPoller al de salida para recuperar el resultado del grafo y, luego, ejecutar un modelo se inicia 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. En el ejemplo, se crean 10 paquetes (cada paquete contiene la cadena “Hello ¡Mundial!" con valores de marca de tiempo que varían de 0, 1, ... 9) con el Función MakePacket, agrega cada paquete al gráfico a través de in y, por último, cierra el flujo de entrada para finalizar la ejecución del grafo.

    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. A través del objeto OutputStreamPoller, el ejemplo recupera los 10. paquetes de la transmisión de salida, obtiene el contenido de cadena de cada paquete y lo imprime en el registro de salida.

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