0

次の範囲で YCbCr データを出力する SoC カメラ モジュールがあります: Y (0 -> 255) Cb および Cr (-127 -> 127)

ここで私の質問は、libjpeg はこれらの符号付きの値を受け入れるか、または符号付きの値を変更して 0 -> 255 の範囲になるようにする必要があるかということです。

SAM3s-EK の一部として ATMEL が提供する libjpeg 'bolt-on' jpeg コンプレッサーを使用しています。ijg_compress_raw_no_padding 関数のボルトオン部分のコードを以下に示します... 私が見る限り、これは YCbCr データのきれいな配列を取り、libjpeg が好む形式に操作します ;-)

    static void _init_sarray_imcu_row(JSAMPIMAGE *image,JSAMPLE *src,uint32_t y_pos,uint32_t width,uint32_t rows)
{
    JSAMPLE *r0;
    JSAMPLE *r1;
    JSAMPARRAY ay = (*image)[0];
    JSAMPARRAY au = (*image)[1];
    JSAMPARRAY av = (*image)[2];
    JSAMPROW ry0,ru,rv,ry1;    

    int i,j;
    for( i = 0; i < rows/2 ;i++)
    {
        r0 = & src[ (i * 2 + y_pos) * width * 2];
        r1 = & src[ (i * 2 + y_pos + 1) * width * 2];

        ry0 = ay[i*2];
        ry1 = ay[i*2+1];

        ru = au[i];
        rv = av[i];

        for(j = 0; j < width /2; j++)
        {
            ry0[j * 2] = r0[j*4];
            ry1[j * 2] = r1[j*4];
            ry0[j * 2 + 1] = r0[j*4+2];
            ry1[j * 2 +1] = r1[j*4+2];

            ru[j] = (r0[ j * 4 + 1] + r1[j*4+1])/2;
            rv[j] = (r0[ j * 4 + 3] + r1[j*4+3])/2;

        }


    }
}

また、この関数を送信する生データ配列内での値の順序についても完全にはわかりません。YCbCrY や YCbYCr などですが、これは出力画像を見れば一目瞭然なのでいじってみます。

そのままでは、いくつかの色が混同されているように見える画像が得られます。赤と青が入れ替わっているように見え、黄色と緑と同じです。

そこで、最初の質問が失われた場合に備えて、最初の質問を繰り返します。

この関数は、範囲 0->255 の値のみを受け入れますか?それとも、Y (0->255) および Cb & Cr (-127->127) を持つカメラからのデータをそのまま受け入れますか?

また、誰かが配列をパックする必要がある順序についてアドバイスできる場合は、それも役立ちます。

どうもありがとうdeBoogle

4

1 に答える 1

0

ウィキペディアによると、JFIF は 0-255 を使用しています。Cb と Cr の色の違いに 128 を追加する必要があるようです。

于 2011-11-29T14:09:16.593 に答える