Hello World! trong C++

  1. Hãy đảm bảo bạn có một phiên bản MediaPipe Framework đang hoạt động. Xem hướng dẫn cài đặt.

  2. Cách chạy ví dụ về 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. Ví dụ hello world sử dụng một biểu đồ MediaPipe đơn giản trong Hàm PrintHelloWorld(), được xác định trong một 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"
        }
      )");
    

    Bạn có thể xem biểu đồ này bằng cách sử dụng MediaPipe Visibilityr (Trình hiển thị MediaPipe) bằng cách dán Nội dung CalculatorGraphConfig bên dưới vào trình hiển thị hình ảnh. Xem tại đây để được trợ giúp về trình hiển thị hình ảnh.

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

    Biểu đồ này bao gồm 1 luồng đầu vào trên biểu đồ (in) và 1 luồng đầu ra trên biểu đồ (out) và 2 PassThroughCalculator được kết nối nối tiếp.

    biểu đồ hello_world

  4. Trước khi chạy biểu đồ, đối tượng OutputStreamPoller được kết nối với để truy xuất đầu ra của biểu đồ và một lần chạy biểu đồ đã được bắt đầu bằng 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. Sau đó, ví dụ này sẽ tạo 10 gói (mỗi gói chứa một chuỗi "Hello" Thế giới!" với các giá trị Timestamp từ 0, 1, ... 9) bằng cách sử dụng Hàm MakePacket, thêm từng gói vào biểu đồ thông qua in luồng đầu vào và cuối cùng đóng luồng đầu vào để hoàn tất việc chạy biểu đồ.

    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. Thông qua đối tượng OutputStreamPoller, ví dụ sau đó truy xuất tất cả 10 các gói từ luồng đầu ra, lấy nội dung chuỗi ra khỏi mỗi gói và in ra nhật ký đầu ra.

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