Android相機實時自動對焦的完美實現

https://zhidao.baidu.com/question/873328177698804372.html

Android相機實時自動對焦的完美實現
http://blog.csdn.net/huweigoodboy/article/details/51378751

如何實現Android手機攝像頭的的自動對焦 http://www.open-open.com/lib/view/open1406536473812.htmlhtml


android 前置攝像頭能夠autofocus方法:
第一:最多見的實現---利用按鍵或拍照前一次性自動聚焦在Activity裏申明變量private
AutoFocusCallback myAutoFocusCallback = null;而後
自動聚焦變量回調

myAutoFocusCallback = new AutoFocusCallback()
{

public void onAutoFocus(boolean success, Camera
camera) {

// TODO Auto-generated method stub

if(success)//success表示對焦成功

{

Log.i(tag, "myAutoFocusCallback:
success...");

//myCamera.setOneShotPreviewCallback(null);

}

else

{

//未對焦成功

Log.i(tag, "myAutoFocusCallback: 失敗了...");

}

}

};

在Camera.startPreview()以後,拍照Camera.takePicture()
以前調用myCamera.autoFocus(myAutoFocusCallback)。

第二:
經過TimerTask設置一個定時器來循環,每隔必定時間調用myCamera.autoFocus(myAutoFocusCallback)一次。結果是攝像頭一直在自我聚焦,重複清晰--模糊----清晰---模糊的過程。

第三:經過Handler和Thread,開啓一個線程進行自動聚焦。本質和第二種是同樣的。後續我會寫一個demo發上來。

第四:
經過監聽傳感器來觸發autoFocus。經常使用的是角度傳感器加速度傳感器,當監聽的值超過必定閾值時觸發。這也是國外程序員們經常使用的思路。

第五:設置聚焦方式爲myParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
Continuous auto focus mode intended for video
recording. The camera continuously tries to focus. This is the best
choice for video recording because the focus changes smoothly .
Applications still can call takePicture(Camera.ShutterCallback,
Camera.PictureCallback,
Camera.PictureCallback) in this mode
but the subject may not be in focus. Auto focus starts when the
parameter is set.
Since API level 14, applications can
call autoFocus(AutoFocusCallback) in
this mode. The focus callback will immediately return with a
boolean that indicates whether the focus is sharp or not. The focus
position is locked after autoFocus call. If applications want to
resume the continuous focus, cancelAutoFocus must be called.
Restarting the preview will not resume the continuous autofocus. To
stop continuous focus, applications should change the focus mode to
other modes.
意思是在錄像的時候調用這種聚焦方式好,在拍照狀況下這種聚焦方式可能不成功。
設置以後myParam.set("rotation",
90);
這句話的設置不起做用。拍攝獲得的照片和預覽的方向是錯90度的。須要獲得Bitmap以後,利用Matrix本身旋轉下。
旋轉示例:mBitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);//data是字節數據,將其解析成位圖myCamera.stopPreview();isPreview = false;
設置FOCUS_MODE_CONTINUOUS_VIDEO)以後,myParam.set("rotation",
90)失效。圖片居然不能旋轉了,故這裏要旋轉下
Matrix matrix = new Matrix();
matrix.postRotate((float)90.0);
Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap,
0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix,
false);
設置成FOCUS_MODE_CONTINUOUS_VIDEO以後,再調用Camera.autoFocus()會聚焦失敗。

第六: 就是經過分析onPreviewFrame獲得預覽幀視頻,分析亮度變化,來觸Camera.autoFocus()。若是亮度變化,確定是攝像頭和被拍攝物體之間發生了相對運動,須要觸發autoFocus()。某些手機裏自帶的拍照軟件可能就是採用這種方式。
相關文章
相關標籤/搜索