3

ブースト画像ライブラリを理解するのに苦労しています。

boost::gil ライブラリに含まれている interleaved_view 関数の使用方法に関する正確なドキュメントは見つかりませんでした。より具体的には、生データがどのバイナリ形式で保存されることになっているのか正確にはわかりません。

私が見つけた唯一の言及は、ギルのチュートリアルでした:

// Calling with 8-bit RGB data into 16-bit BGR
void XGradientRGB8_BGR16(const unsigned char* src_pixels, ptrdiff_t src_row_bytes, int w, int h,
                                 signed short* dst_pixels, ptrdiff_t dst_row_bytes) {
    rgb8c_view_t  src = interleaved_view(w,h,(const rgb8_pixel_t*)src_pixels,src_row_bytes);
    rgb16s_view_t dst = interleaved_view(w,h,(    rgb16s_pixel_t*)dst_pixels,dst_row_bytes);
    x_gradient(src,dst);
}

また、関数プロトタイプは言う

template<typename Iterator>
type_from_x_iterator< Iterator>::view_t     
boost::gil::interleaved_view (std::size_t width, std::size_t height, Iterator pixels, std::ptrdiff_t rowsize_in_bytes)
//Constructing image views from raw interleaved pixel data. 

私の質問は、バイナリ形式で gil が期待する形式とは正確には何ですか?

以前にインターリーブされた画像を見たのは、OpenGL を使用したときだけでした。これは、隣同士に格納された各ピクセルの RGB 情報にすぎませんでした。rowsize_in_bytes は文字通りバイト単位のピクセル行のサイズになると思ったので、これで PNG を書き込もうとしました:

void makeImage(const string fileName, const unsigned char * src, const int w, const int h) {
    rgb8c_view_t outImage = interleaved_view(w,h, (const rgb8_pixel_t*) src, w*3*sizeof(unsigned char));
    boost::gil::png_write_view(fileName,outImage);
}

入力 src は、サイズ w*h のフラットな配列であり、フォーマット

(char)R, (char)G, (char)B, (char)R, (char)G, (char)B, (char)R, (char)G, (char)B ...

画像は、黒い背景に白い箱だけでした。しかし、得られた結果はかなり... 奇妙なものでした

結果

なぜこれが起こったのか、そしてinterleaved_viewが実際にどのように機能するのか、誰かが知っているなら、それは素晴らしいことです. 前もって感謝します!

編集:申し訳ありませんが、私は自分のばかげた間違いに気づきました。私は今それを機能させました... :(問題は画像の形式ではなく、列優先ではなく行優先でした

4

1 に答える 1

8

申し訳ありませんが、投稿した直後に、MATLABを長時間使用していることに気づきました...配列を列の主要な形式で記述しました...うーん、バカだと思います

于 2010-10-03T23:01:44.123 に答える