2017-06-19 2 views
0

私はtensorRTを使って埋め込まれた深い学習推論C++プロジェクトに取り組んでいます。 私のモデルでは、平均画像を減算する必要があります。埋め込みシステム用のPNG画像をロードする

私が使用しているAPIは、RGB画像のための次のようなデータ構造での平均画像を定義するために私を許可する:

uint8_t *data[DW_MAX_IMAGE_PLANES];  // raw image data 
size_t pitch;        // pitch of the image in bytes 
uint32_t height;       // height of the image in px 
uint32_t width;       // image width in px 
uint32_t planeCount;      // plane count of the image 

これまでのところ、私はこの作業のために、私は非常に便利ですLIB LodePNGを見つけました思う。 それはわずか数行でPNG画像を読み込むことができます。今

// Load file and decode image. 
std::vector<unsigned char> image; 
unsigned width, height; 
unsigned error = lodepng::decode(image, width, height, filename); 

質問はuint8_t *[DW_MAX_IMAGE_PLANES]std::vector<unsigned char>を変換し、ピッチとプレーン数の値を計算する方法ですか?

私は、RGB画像にDW_MAX_IMAGE_PLANESを使用していたようpitchplaneCount 3.

+0

pngを既に正常に読み込んだので、あなたの質問のタイトルが間違っているようです。 –

+0

おそらく['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)の参考資料が参考になるでしょうか?ベクトルによって管理されているデータへのポインタを取得するには、最初の要素へのポインタを取得するなど、いくつかの方法があります(ただしこれに限定されません)。 –

+0

残りの部分については、あなたが提供したライブラリがあなたにそのメタデータを提供していませんか? –

答えて

0

値は単純です等しいです。 LodePNGのdecodeはデフォルトでbitdepth = 8になるため、pitchという値は、1です。また、画像はRGBであるため、planeCountの値は3 - 各色の平面です。

あなたはアルファチャンネルを使用していないので、おそらくLodePNGは、単に直接RGB形式にデコードしておく必要があります

unsigned error = lodepng::decode(image, width, height, filename, LCT_RGB); 

しかし、画像がstd::vector<unsigned char>にデコードされた後、あなたがそれを使用することはできません直接。

image -> R0, G0, B0, R1, G1, B1, R2, G2, B2, ... 

しかし、あなたは、次の形式でそれを必要とする:LodePNGからデコードされたデータは、次のフォーマットである

data[0] -> R0, R1, R2, ... 
data[1] -> G0, G1, G2, ... 
data[2] -> B0, B1, B2, ... 

あなたが制約記憶されている場合、あなたは内の値を再配置する必要がありますイメージベクトル(R0, R1, ... Rn, G0, G1, ... Gn, B0, B1, ... Bn)と適切なポインタを計算してdataアレイを初期化します。

メモリがある場合は、3つのカラーチャネルごとに別々のベクトルを作成できます。次に、デコードされたimageからデータをコピーし、data配列をベクトルの最初の要素へのポインタで初期化します。

関連する問題