Должны ли значения CbCr для LibJPEG быть подписанными или неподписанными - PullRequest
0 голосов
/ 11 августа 2011

У меня есть модуль камеры SoC, который выводит данные YCbCr в следующих диапазонах: Y (0 -> 255) Cb и Cr (-127 -> 127)

Теперь мой вопрос: принимает ли libjpeg эти подписанные значения или я должен изменить подписанные значения, чтобы они находились в диапазоне 0 -> 255?

Я использую компрессор jpeg libjpeg «на болтах», предоставляемый ATMEL, как часть SAM3s-EK. Код для части с болтовым соединением для функции 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

1 Ответ

0 голосов
/ 29 ноября 2011

Согласно Википедии JFIF использует 0-255. Похоже, вам нужно добавить 128 к разнице в цветах Cb и Cr.

...