2017-12-12 24 views
0

私は現在、いくつかのタスクを実行するためにtensorflowを使用し、フレームを傍受フレーム上のデータを書き込み、後ろにそれを注入うGstreamer1.0プラグインを書いていますから、入力テンソルを作成tensorflow - のgstreamerバッファ

Iを。私はC/C++でこれをやっていますが、データがGstreamerとTensorflowの間で流れなければならない時に、現在問題に直面しています。

私はGstBufferオブジェクトにデータを抽出し、入力Tensorを構築する必要があるフレームを持っています。私は私を想定していますか見当がつかない

Tensor input(tensorflow::DT_UINT8, tensorflow::TensorShape(cwidth, cheight, 3)); 

: フォーマットは私が今構築しなければならない[、幅、高さ3] UINT8 RGBマトリックス、常に同じであるバイトのポインタで

/* extract raw data from gstreamer buffer */ 
gpointer bytes; 
gst_buffer_extract_dup(outbuf, 0, size, &bytes, &copied); 

それをする。
私はgpointerとtensorflowでどのように動作するかに関する情報や例を見つけることができませんでした。私のケースではないソースとしてファイルを使用している例しか見つけられませんでした。

いずれのリードまたは洞察力も高く評価されます。

答えて

0

私は方法を見つけましたが、あなたのバッファがRGB、3チャンネルのフレームバッファである場合にのみ機能します。

Tensor ConvertRGBBufferToInputTensor(gpointer buffer, gint cwidth, gint cheight, gint channel) { 

    Tensor input_tensor(tensorflow::DT_UINT8, tensorflow::TensorShape({1, cwidth, cheight, channel})); 
    auto input_tensor_mapped = input_tensor.tensor<uint8_t, 4>(); 

    uint8_t * uintdata = (uint8_t*)buffer; 

    for (int y = 0; y < cheight; ++y) { 
     const uint8_t* source_row = uintdata + (y * cwidth * channel); 
     for (int x = 0; x < cwidth; ++x) { 
      const uint8_t* source_pixel = source_row + (x * channel); 
      for (int c = 0; c < channel; ++c) { 
       const uint8_t* source_value = source_pixel + c; 
       input_tensor_mapped(0, y, x, c) = *source_value; 
      } 
     } 
    } 

    return input_tensor; 
} 

そして、あなたはGstBuffer

/* extract raw data from the buffer and convert it to an input tensor */ 
gst_buffer_extract_dup(outbuf, 0, size, &bytes, &copied); 
GST_INFO("Extracted %" G_GSIZE_FORMAT " from buffer" , copied); 
Tensor input_tensor = ConvertRGBBufferToInputTensor(bytes, cwidth, cheight); 
g_free(bytes); 
を持っているときのgstreamerからそれを使用します