2013-01-24 55 views
0

我想從相機的,我檢查瞭解決方案的亮度(計數平均亮度) obtaining-luminosity-from-an-ios-camera獲取亮度

但相機自動設置曝光,因此,如果打開相機對光線的來源(例如燈泡),那麼在第一次亮度非常高,但一段時間後,這個值很低,因爲曝光設置被改變了。我已經測試了鎖定曝光,但這不是一個好的解決方案,因爲如果曝光在來自相機的圖像是黑暗的時候被鎖定,那麼很少的光源被視爲非常高的值。有什麼辦法來獲得亮度的絕對值? 我已經檢查了應用程序光檢測器和此應用程序效果很好,曝光更改,但亮度值穩定。

問候亞當

+1

也許它結合了曝光設置(假設你可以讀這個)和測量的亮度來估計絕對亮度。 –

+0

與此同時,我檢查了它是好的方向,我們可以閱讀曝光設置,但關鍵是如何正確組合曝光設置 –

+1

使用試驗和錯誤來構建應用程序插值的查找表。 –

回答

0

你知道如何創建一個自定義的核心圖像過濾器,它返回一個CIKernel(或CIColorKernel)對象的輸出?如果沒有,你應該;並且,我很樂意爲您提供易於理解的說明。

假設你做什麼,這裏的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代碼;我修改它只顯示亮度值。