2013-01-24 2 views
0

Я хочу, чтобы получить яркость от камеры, я проверил решение (подсчет средней яркости) obtaining-luminosity-from-an-ios-cameraПолучить яркости от IOS камеры

но камера автоматически устанавливает экспозицию, так что если включить камеру к источнику света (например, лампы накаливания), то в первый раз яркость очень велика, но через некоторое время это значение низкое, поскольку настройки экспозиции были изменены. Я тестировал с блокировкой экспозиции, но это нехорошее решение, потому что если экспозиция была заблокирована, когда изображение с камеры темное, то источник света считается очень высоким. Есть ли способ получить абсолютное значение яркости? Я проверил приложение Датчик света, и это приложение работает хорошо, экспозиция изменена, но значение яркости стабильно.

С уважением Adam

+1

Возможно, он объединяет настройку экспозиции (при условии, что вы можете прочитать это) и измеренную яркость, чтобы оценить абсолютную яркость. –

+0

Тем временем я проверил, что это хорошее направление, и мы можем прочитать настройки экспозиции, но ключ заключается в том, как правильно комбинировать настройки экспозиции. –

+1

Используйте пробную версию и ошибку, чтобы создать таблицу поиска, которую приложение интерполирует. –

ответ

0

вы знаете, как создать пользовательский фильтр с сердечником изображения, которая возвращает результат выполнения (или CIColorKernel) объекта CIKernel ли? Если нет, вы должны; и я был бы рад предоставить вам простые для понимания инструкции для этого.

Предполагая, что вы делаете, вот код OpenGL ES, который будет возвращать только значение яркости изображения он обрабатывает:

vec4 rgb2hsl(vec4 color) 
{ 
    //Compute min and max component values 
    float MAX = max(color.r, max(color.g, color.b)); 
    float MIN = min(color.r, min(color.g, color.b)); 

    //Make sure MAX > MIN to avoid division by zero later 
    MAX = max(MIN + 1e-6, MAX); 

    //Compute luminosity 
    float l = (MIN + MAX)/2.0; 

    //Compute saturation 
    float s = (l < 0.5 ? (MAX - MIN)/(MIN + MAX) : (MAX - MIN)/(2.0 - MAX - MIN)); 

    //Compute hue 
    float h = (MAX == color.r ? (color.g - color.b)/(MAX - MIN) : (MAX == color.g ? 2.0 + (color.b - color.r)/(MAX - MIN) : 4.0 + (color.r - color.g)/(MAX - MIN))); 
    h /= 6.0; 
    h = (h < 0.0 ? 1.0 + h : h); 

    return vec4(h, s, l, color.a); 
} 

kernel vec4 hsl(sampler image) 
{ 
    //Get pixel from image (assume its alpha is 1.0 and don't unpremultiply) 
    vec4 pixel = unpremultiply(sample(image, samplerCoord(image))); 

    //Convert to HSL; only display luminance value 
    return premultiply(vec4(vec3(rgb2hsl(pixel).b), 1.0)); 
} 

Выше OpenGL ES код, написанный изначально разработчики компании Apple; Я изменил его, чтобы отображать только значения яркости.