У меня есть модуль камеры 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