artymen писал(а):да, YUYV весьма темный и скользкий формат из-за "двухпиксельности", и это создает жуткую путаницу.
Светлый и ясный формат
У меня есть OV9655, там этот формат тоже есть.
Вкратце, есть два соседних пикселя с камеры (P1, P2).
Их цвет описывается как (Y1, U, Y2, V). Y1, Y2 = яркости для каждого пикселя.
U, V = общие для обоих пикселей. Y1, U, Y2, V = 4 байта.
Конверсия в RGB:
- Код: Выделить всё
// Common part for both pixels
u = frameBuffer[idxFrame]; // U component
v = frameBuffer[idxFrame + 2]; // V component
// Start YUV -> RGB conversion
u -= 128;
v -= 128;
v1 = (5727 * v);
uv1 = -(1617 * u) - (2378 * v);
u1 = (8324 * u);
// Pixel #1
y = frameBuffer[idxFrame + 1];
y1 = y << 12;
r = (y1 + v1) >> 12;
g = (y1 + uv1) >> 12;
b = (y1 + u1) >> 12;
if (r > 255) r = 255;
else if (r < 0) r = 0;
if (g > 255) g = 255;
else if (g < 0) g = 0;
if (b > 255) b = 255;
else if (b < 0) b = 0;
// Use (rgb) for pixel #1
//putchar(r); putchar(g); putchar(b);
// Pixel #2
y = frameBuffer[idxFrame + 3];
y1 = y << 12;
r = (y1 + v1) >> 12;
g = (y1 + uv1) >> 12;
b = (y1 + u1) >> 12;
if (r > 255) r = 255;
else if (r < 0) r = 0;
if (g > 255) g = 255;
else if (g < 0) g = 0;
if (b > 255) b = 255;
else if (b < 0) b = 0;
// Use (rgb) for pixel #2
//putchar(r); putchar(g); putchar(b);