Просто конвертируйте ваше изображение в формат YUV и рассчитайте среднее значение канала яркости. Преобразование цветов является типичной операцией, и любая приличная структура обработки изображений поддерживает это. Например, OpenCV (вы сказали OpenGL, но это не имеет ничего общего с обработкой изображений, я предполагаю, что вы имели в виду OpenCV) имеет CvtColor .
Если у вас нет такой удобной структуры, но есть доступ к интенсивности пикселей, вы можете использовать уравнение:
Y' = 0.299*R + 0.587*G + 0.144*B
, чтобы получить канал яркости, а затем рассчитать среднее. R, G и B обозначают красный, зеленый и синий каналы соответственно.
EDIT
Обратите внимание, что ваша камера может компенсировать яркие / темные сцены, изменяя диафрагму. Это зависит от камеры, но я думаю, что большинство камер делают это - иначе ваши снимки могут оказаться либо насыщенными (чисто белыми), либо просто черными - в любом случае, бесполезными. Человеческие глаза на самом деле делают то же самое .
Недостатком является то, что трудно определить, находитесь ли вы в темноте или на свету, просто взглянув на изображение. В этом случае вам, возможно, придется выйти за пределы изображения и запросить камеру. Теоретически вы можете сделать это либо напрямую через драйвер (маловероятно), либо, возможно, просмотрев метаданные изображения (например, в формате JPEG, есть EXIF ).
Наконец, вы еще не сказали, что именно вы хотите знать о яркости. Если это общая сцена, то средняя будет достаточно хорошей. Если это какая-то часть сцены, вам, возможно, придется сделать что-то более умное. Дайте нам знать, если это так.