用 C++ 撰寫的 Hello World!

  1. 確認您的 MediaPipe Framework 運作正常。詳情請見 安裝操作說明

  2. 如要執行 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. hello world 範例採用 PrintHelloWorld() 函式,在 CalculatorGraphConfig proto 中定義。

    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"
        }
      )");
    

    但您可以使用 MediaPipe Visualizer 方法是將 將下方的 CalculatorGraphConfig 內容放入視覺化工具中。詳情請見 這裡的說明。

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

    這張圖表包含 1 個圖表輸入串流 (in) 和 1 個圖形輸出串流 (out) 和 2 個 PassThroughCalculator 已序列連線。

    hello_world 圖表

  4. 執行圖表之前,OutputStreamPoller 物件會連線至 以便稍後擷取圖形輸出內容 開始使用 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. 此範例會建立 10 個封包 (每個封包都含有「Hello」字串 全世界!」時間戳記值介於 0、1 ... 9) 之間,並使用 MakePacket 函式,透過 in 將每個封包加入圖表 最後,關閉輸入串流以完成圖形執行作業。

    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. 此範例會透過 OutputStreamPoller 物件,擷取所有 10 個 輸出串流中的封包,然後將每個封包的字串內容從每個封包中取得 然後輸出到輸出記錄檔

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