2011-02-02 3 views
7

Приложение для iphone фиксирует данные в реальном времени с камеры с помощью AVCaptureSession AVFoundation. Я могу получить доступ к этим данным в его методе делегирования во время выполнения и создать изображение из него. Это может быть CGImage, UIImage или просто необработанные данные (CMSampleBufferRef).Определение яркости/яркости изображения

Что я пытаюсь сделать, так это рассчитать яркость, яркость этих данных (изображения). Или это может быть какое-то другое значение, которое может указать мне, насколько ярким является входной свет.

Есть ли стандартный способ получить это значение? Возможно, используя OpenGL.

Заранее спасибо.

ответ

13

Просто конвертируйте свое изображение в YUV format и вычислите среднее значение канала яркости. Цветопередача является типичной операцией, и любая достойная среда обработки изображений поддерживает ее. Например, OpenCV (вы сказали OpenGL, но это действительно не имеет никакого отношения к обработке изображений, я предполагаю, что вы имеете в виду OpenCV) имеет CvtColor.

Если у вас нет такой структуры, но удобный доступ к интенсивности пикселей, вы можете использовать уравнение:

Y' = 0.299*R + 0.587*G + 0.144*B 

, чтобы получить канал яркости, а затем вычислить среднее значение. R, G и B представляют собой красный, зеленый и синий каналы соответственно.

EDIT

Обратите внимание, что это возможно, что ваша камера будет компенсировать яркие/темные сцены, изменяя его апертуру. Это зависит от камеры, но я думаю, что большинство камер делают это, иначе ваши снимки могут быть либо насыщенными (чисто белыми), либо просто черными - в любом случае бесполезными. Человеческие глаза фактически do the same thing.

Недостатком является то, что трудно определить, находитесь ли вы в темной или светлой среде, просто глядя на изображение. В этом случае вам может потребоваться выйти за пределы изображения и запросить камеру. Теоретически вы можете сделать это либо напрямую через драйвер (маловероятно), либо, возможно, взглянув на метаданные изображения (например, с помощью JPEG, есть EXIF).

Наконец, вы не сказали, что именно вы хотите знать яркость. Если это общая сцена, то среднее будет достаточно хорошим. Если это какая-то часть сцены, вам, возможно, придется сделать что-то более умное. Сообщите нам, если это так.

+0

Спасибо, я думаю, это должно сработать. Я попробую и отправлю результат здесь. – krafter

+0

Взгляните на мой отредактированный комментарий - я определил потенциальную проблему и некоторые способы ее решения. – misha

+0

Да, это действительно работает: получение информации о пикселях, разделяющей ее на интенсивности цвета, а затем вычисление Y, как вы показали здесь. Так как мне нужно среднее значение яркости малых (быстрых) световых пульсаций, прежде чем камера сможет приспособиться к ней, этот метод работает хорошо. Еще раз спасибо. – krafter

Смежные вопросы