Я начал редактировать код RaspiStillYUV.c. В конечном итоге я хочу обработать полученное изображение, но пока я просто работаю над его пониманием. Почему я работаю с YUV вместо RGB? Так я смогу узнать что-то новое. Я внес небольшие изменения в функцию camera_buffer_callback
. Все, что я делаю, это следующее:
fprintf(stderr, "GREAT SUCCESS! %d\n", buffer->length);
Строка, которую это заменяет:
bytes_written = fwrite(buffer->data, 1, buffer->length, pData->file_handle);
Теперь размеры должны быть 2592 x 1944
(Ш x В), как указано в коде. Отрабатывая Википедию (YUV420), я пришел к вывод, что размер файла должен быть w * h * 1.5
. Поскольку компонент Y имеет 1 байт данных для каждого пикселя, а компоненты U и V имеют 1 байт данных для каждых 4 пикселей (1 + 1/4 + 1/4 = 1.5)
. Большой. Выполнение математики в Python:
>>> 2592 * 1944 * 1.5
7558272.0
К сожалению, это не совпадает с выводом моей программы:
GREAT SUCCESS! 7589376
Это оставляет разницу в 31104
байт.
Я полагаю, что буфер выделяется кусками фиксированного размера (выходной размер делится без остатка на 512). Хотя я хотел бы понять эту загадку, я согласен с объяснением куска фиксированного размера.
Мой вопрос, если я что-то упустил. Имеют ли смысл дополнительные байты сверх ожидаемого размера в этом формате? Следует ли их игнорировать? Мои расчеты неверны?