2012-10-30 16 views
1

我實際上在使用三星galaxy選項卡10.1的android上構建應用程序。 我想要使用設備的後置攝像頭獲取亮度的值。使用背部相機計算亮度android

問題是設備背面沒有光線傳感器,只能獲取光線傳感器給我們的值。所以我必須手動完成,實際上,我必須實時拍攝幀,並且爲每個幀計算灰度圖像的平均值,但仍然存在一個問題:使用此方法,您將產生錯誤的值,因爲相機的自動校正和白平衡。例如,如果您將攝像機指向非常明亮的光源,則攝像機將對焦於明亮區域,並且所有在明亮點處出現的區域將變得非常暗,以便灰度圖像的平均值會給出我們是一個虛假的價值(在這種情況下它不會很高,因爲有黑暗的地方)。 我在API中搜索了禁用這些更正的方法,但是我沒有發現有趣的東西。

所以,問題是:有沒有一種方法可以使用後置攝像頭獲取亮度值?

謝謝。

回答

1

不幸的是,你是正確的,目前沒有辦法從Android相機API獲取這些數據。

根據您的設備,您可能能夠拍攝圖片,然後從中讀取EXIF數據。這可以讓你看到曝光(ISO和快門速度)。這是像Tiny Light Meter使用的應用程序的方法。問題在於某些設備沒有完全填充EXIF數據,所以這種方法存在問題。

+0

這應該是一個評論,如果我錯了請留下它,否則,請張貼它,並刪除您的答案。 –

+0

據我所知,這是問題的明確答案:目前沒有API支持,但有些人使用EXIF數據已經成功。 –

+0

我沒有使用Android的經驗(我使用它!),但據我所能/可以告訴,你在你的答案中提出另一個問題,而不是提供一個。 –

0

在某些設備(僅適用於較新的Android)中,支持點測光。您可以使用由AsyncTask等單獨計時器線程觸發的JPEG回調,然後讀取將計量到選定點的EXIF信息。要檢查這是否是可用的,你可以使用:

//on Event Touch callback on your SurfaceView 
x=event.getX(); 
y=event.getY(); 
params=camera.getParameters(); 
... //check for rotation, calculate focus point (x, y: -1000, 1000) 
if(params.getMaxNumMeteringAreas() > 0){ 
    //draw a meter area, however big you want, 1000 is weight (0-1000) 
    Camera.Area ca=new Area(new Rect(x-25, y-25, x+25, y+25), 1000); 
    List<Camera.Area> areas=new ArrayList<Area>(); 
    areas.add(ca); 
    params.setFocusAreas(areas); 
    params.setMeteringAreas(areas); 
    camera.setParameters(params); 
}else{ 
    //process the Bitmap and do the below... 
} 

在舊設備上(如果你想向後兼容),你仍然可以設置對焦點(存儲在您的代碼),然後執行像素的平均值圍繞這個焦點(我使用寬度和高度的6%)與EXIF值相比較(如果它更暗,降低曝光等)。爲此,您可能希望使用按鍵式按鈕(因爲較舊的設備在進行JPEG回調時會滯後)。

average=((r+g+b)/3-128)/256 
myEV=myEV+myEV*average 

使用這兩種方法,只是確保你正在閱讀的圖像被正確地旋轉(你可以把它變成一個ImageView的和比較它的預覽檢查)。

從EV你可以相對容易地轉換爲勒克斯或腳蠟燭(或任何你喜歡的測量)。